思维导图

Java异常处理

异常简介

系统中存在编译时错误,还有运行时错误,还有逻辑错误。

在Java中被整除时,如果被除数是0,有两种不同的情况。

1
2
3
4
5
6
double d1 = 10 / 0.0; // POSITIVE_INFINITY 正无穷大
double d2 = 0.0 / 0; // NaN 非数字
double d3 = -1f / 0.0;// NEGATIVE_INFINITY 负无穷大


int i = 10 / 0; // 编译错误

整数被零除是违法的。

运行时错误,称之为异常。

异常和异常类

所有异常类都派生自类Java.lang.Throwable;这个类其中有两个子类,其中java.lang.Error,表示系统错误。一般也称之为错误(Error),java.lang,Exception 表示可能从任何Java方法或运行期偶发事件中抛出的异常。

Exception

Exception中的子类

异常类型 说明
java.lang.RuntimeException 那些可能在java虚拟机中正常运行期间抛出的异常的父类
java.io.IOException 发生I/O异常
java.lang.NoSuchFieldException 类不包含指定名称的数据成员时,抛出该异常

上面的类除了RunTimeException外其他的异常都需要有专门的异常处理代码对这些异常进行处理。

RuntimeException

RuntimeException中的子类

异常类型 说明
java.lang.ArithmeticException 出现异常的运算条件时,抛出该异常,如整数运算中的被零除
java.lang.ArrayStoreException 试图将错误对象存储的对象存储到一个对象数组时,抛出该异常
java.lang.ClassCastException 试图将错误对象类型转换为不是实例的子类时

抛出和声明异常

对自定义异常类需要使用throw显示抛出,系统预定义的异常类也可以显示抛出

1
2
3
4
5
static int method(int a,int b) throws MyException,ArithmeticException{
if(a < 0) throw new MyException("被除数不能等于0");
if(b == 0) throw new ArithmeticException("除数不能等于0");
return a/b;
}

捕获异常

如果程序中没有定义相应的异常捕获代码,按照系统默认的方式进行处理。如果有,那就按照程序中加入相应的异常捕获代码。

异常捕获的基本语法

1
2
3
4
5
6
7
8
9
try{
可能抛出异常的程序代码
}catch(Type1 t1){
对Type1 类异常进行处理的代码
}catch(Type2 t2){
对Type2 类异常进行处理的代码
}catch(TypeN tn){
对TypeN 类异常进行处理的代码
}

如果在try中发生异常,立即中断现在语句的执行。在catch语句中寻找符合的异常类型,如果找到,那么直接从该catch语句中的第一句语句开始执行,忽略所有catch语句。

如果没有符合匹配,就按默认方式调用方法printStackTrace 在标准错误输出上打印出当前异常名称及其栈追踪信息。然后终止该程序运行。

捕获所有异常

在最后的catch语句后加入一个catch(Exception)类即可,因为所有的这种异常类都继承Exception

1
2
3
4
5
6
7
8
9
10
11
try{
可能抛出异常的程序代码
}catch(Type1 t1){
对Type1 类异常进行处理的代码
}catch(Type2 t2){
对Type2 类异常进行处理的代码
}catch(TypeN tn){
对TypeN 类异常进行处理的代码
}catch(Exception ex){
对所有异常进行捕获。一般放在最后面;
}

Finally 语句

为那种不管是否发生异常都需要进行执行的语句服务。finally语句一般用于释放外部资源,比如关闭曾经打开的文件。一般位于最后面,finally语句要在所有catch语句之后

1
2
3
4
5
6
7
8
9
10
11
12
13
try{
可能抛出异常的程序代码
}catch(Type1 t1){
对Type1 类异常进行处理的代码
}catch(Type2 t2){
对Type2 类异常进行处理的代码
}catch(TypeN tn){
对TypeN 类异常进行处理的代码
}catch(Exception ex){
对所有异常进行捕获。一般放在最后面;
}finally{
每次都执行的代码
}