Java异常:运行期出现的错误

1. Java异常是Java提供的用于处理程序中错误的一种机制;

2. 错误指的是程序运行期间发生的异常事件,如除零溢出、数组下标越界、读取的文件不存在....

3. Java程序的执行过程中如出现异常事件,会生成一个异常类对象,该异常对象封装了异常事件的信息并将其提交给Java运行时系统,此过程称之为抛出异常(throw exception);

4. 当Java运行时系统接收到异常对象后,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,此过程称之为捕获异常(catch exception);

5. 异常的分类:J2SDK中定义了很多异常类,这些异常类对应了各种各样可能出现的异常事件,如下图

① Error:称为错误(系统错误),你处理不了,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理.

② Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示声明或捕获.

③RuntimeException:一类特殊的异常,如被0除、数组下标越界,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行的效率影响很大。因此由系                                         统自动检测并将他们交给缺省的异常处理程序(用户可不比对其处理).

6. try语句

① try{...} 语句指定了一段代码,该段代码就是一次捕获并处理例外的范围;

② 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常作相应的处理;

③ 如果没有例外产生,所有的catch代码都被忽略,不执行.

7. catch语句

① 在catch语句块中是对异常进行处理的代码,每个try语句可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象;

② 在catch中声明的异常对象(catch(someException e))封装了异常事件发生的信息,在Catch语句块中可以使用这个对象的一些方法获取这些信息.

③  getMessage()方法,用来得到有关异常事件的信息;

printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容;

一般而言,printStackTrace()方法用得比较多,它包含了getMessage()方法的内容,跟踪异常:如果一段代码可能发生异常是由于另外一段代码异常引起的,则它会打            印两段代码的异常信息,以及出错位置.

8. finally语句

①  finally语句为异常处理提供了一个统一的出口,使得在控制流程转到程序的其它部分以前,能够对程序的状态做统一的管理;

②  无论try语句指定的程序块中是否抛出异常,finally所指定的代码都要被执行;

③  通常在finally语句中进行资源的清除工作,如:关闭打开的文件、删除临时文件、释放非内存资源;

9. 除了在测试之外,在你实际当中编程的时候,在main方法中抛出Exception是相当不好的编程习惯,应该写try,catch作相应的处理;

10. 在一个try语句块中,父类异常的捕获语句不可以写在子类异常的捕获的上面,否则会覆盖子类的异常;

11. 使用自定义异常:

其中,自定义异常的步骤如下:

① 通过继承 java.lang.Exception类声明自己定义的异常;

② 在方法适当的位置,生成自定义异常的实例,并用 throw 语句抛出;

③ 在方法的声明部分用 throws 语句声明该方法可能抛出异常.

如 Demo_3 所示.

12.  Demo

Demo_1

import java.io.*;
public class TestEx {
public static void main(String[] args){
FileInputStream in = null;
int b;
try {
in = new FileInputStream("myfile.txt");
b = in.read();
while(b != -1){
System.err.println((char)b);
b = in.read();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
in.close();
System.out.println("hello");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

Demo_2

import java.io.*;
public class TestEx {
void m(int i) throws ArithmeticException{
if(i==0){
throw new ArithmeticException("被除数为0");
}
}
void f() throws FileNotFoundException, IOException {
FileInputStream in = new FileInputStream("myfile.txt");
int b;
b = in.read();
while(b != -1){
System.out.println((char)b);
b = in.read();
}
}
void g() throws Exception {
f();
}
public static void main(String[] args){
try {
new TestEx().g();
} catch (Exception e) {
e.printStackTrace();
}
}
}

Demo_3

class MyException extends Exception {
private int id;
public MyException(String message, int id) {
super(message);
this.id = id;
}
public int getId(){
return id;
}
} public class TestEx {
public void regist(int num) throws MyException{
if(num<0){
throw new MyException("人数为负值,不合理",3); //regist方法在这个地方抛出异常后,这个方法就不会继续往下执行了
}
System.out.println("登记人数: "+num);
}
public void manager(){
try {
regist(100);
// regist(-1);
} catch (MyException e) {
System.out.println("登记失败,出错类型:"+e.getId());
e.printStackTrace();
}
System.out.println("操作结束");
}
public static void main(String[] args){
TestEx te = new TestEx();
te.manager();
}
}

regist(100)的运行结果:登记人数: 100
                                  操作结束

regist(-1)的运行结果:登记失败,出错类型: 3
                                操作结束
                                MyException: 人数为负值,不合理
                                        at TestEx.regist(TestEx.java:15)
                                        at TestEx.manager(TestEx.java:22)
                                        at TestEx.main(TestEx.java:31)

13.  异常与继承之间的关系

在继承后,重写方法需要抛出与原来异常类型一致异常或不抛出异常.

class A{
public void method() throws IOException{}
}
class B1 extends A{ // 错误
public void method() throws FileNotFoudException{}
}
class B3 extends A{ // 正确
public void method(){}
}
class B4 extends A{ // 错误
public void method(){} throws IOException, MyException{}
}

Java异常(Exception)的更多相关文章

  1. 浅谈java异常[Exception]

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...

  2. Java 异常Exception e中e的getMessage()和toString()以及 e.printStackTrace();方法的区别

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo {     private static String ...

  3. java异常Exception

    学习笔记: 一.程序的异常:Throwable 严重问题:Error ,我们不处理.这种问题一般很严重,不如内存溢出 问题:Exception 编译问题:不是RuntimeException异常.必须 ...

  4. Java 异常Exception e中e的getMessage()和toString()方法的区别

    示例代码1: public class TestInfo { private static String str =null; public static void main(String[] arg ...

  5. Java异常 - Exception总结

    这篇blog总结的比较详细了. 如下图所示,在Java中所有异常的基类均为Throwable类.有两个子类,分别为Exception和Error.其中Error主要由JVM处理,比如OutOfMemo ...

  6. Java异常 Exception类及其子类

    C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...

  7. java异常——Exception、RuntimException

    一.Exception和RuntimeException的区别 Exception是RuntimeException的父类,使用了 Exception 的类都必须对异常进行处理(try / throw ...

  8. Atitit java的异常exception 结构Throwable类

    Atitit java的异常exception 结构Throwable类 1.1. Throwable类 2.StackTrace栈轨迹1 1.2. 3.cause因由1 1.3. 4.Suppres ...

  9. 2015年11月26日 Java基础系列(五)异常Exception

    序,异常都是标准类Throwable的一些子类的对象. Throwable类的几个方法 1 getMessage() 返回描述该异常的信息 2 printStackTrace() 把消息和栈的跟踪记录 ...

随机推荐

  1. HTML5之特效

    2D转换 在二维的平面上做一些变化,使用transform属性 1. 2D转换之移动(translate) 案例: div{ width: 200px; height: 200px; backgrou ...

  2. php的基础知识(一)

    php(超文本预处理器)定义: php(外文名:php:Hertext Preprocessor,中文名:“超文本预处理器”)是一种通用的开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于 ...

  3. Js 手指事件

    1.Touch事件简介   pc上的web页面鼠标会产生onmousedown.onmouseup.onmouseout.onmouseover.onmousemove的事件,但是在移动终端如ipho ...

  4. python应用:爬虫框架Scrapy系统学习第二篇——windows下安装scrapy

    windows下安装scrapy 依次执行下列操作: pip install wheel pip install lxml pip install PyOpenssl 安装Microsoft visu ...

  5. 009---linux进程管理

    进程管理 top 查看运行状态:top 查看cpu核心数:top and 1 查看cpu占用率最大:top and P free 查看内存状态:free 以M为单位:free -m 以G为单位:fre ...

  6. Sql Server char、varchar、nchar、nvarchar的区别

    (1) 定义: char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度,存储ANSI字符,根据 ...

  7. 将 List<Obj> 集合, 导出至 Excel

    主代码在这:http://www.codeproject.com/Articles/120480/Export-to-Excel-Functionality-in-WPF-DataGrid 黑人老外写 ...

  8. Windows 显示环境变量

    echo %% D:\>echo %python3% C:\Users\zy\AppData\Local\Programs\Python\Python36 D:\> 我的环境变量如下:

  9. spring源码-Aware-3.4

    一.Aware接口,这个也是spring的拓展之一,为啥要单独拿出来讲呢,因为他相比于BeanFactoryPostProcessor,BeanPostProcessor的实用性更加高,并且在具体的业 ...

  10. 在Sqlserver中生成随机数据

    百度了各种随机生成,集中摘录如下: 一.循环写入千万级测试数据 DECLARE @i int ) BEGIN INSERT INTO A_User(username,password,addtime, ...