1、 Java异常处理类结构图
1) 两种分类方法
[1]. 按照程序可以处理或者不能处理分为:Error(错误)和Exception
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
Exception(异常):是程序本身可以处理的异常。
Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和ArrayIndexOutOfBoundException。
[2]. 按照编译器是否可识别,分为checkedexception和unchecked exception
checked exception:编译器可以识别的异常,这类异常必须在代码中进行处理才能通过编译。也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。包含除RuntimeException及其子类之外的类代表的异常。
unchecked exception:是编译器无法识别的异常,可能在运行时产生。包含RuntimeException及其子类。
2)、 throw与throws
throw 用在语句中,创建一个新的异常对象;throws用在方法上指明该方法可能跑出的异常
3)、 finally 与return
[1]. 不管有木有出现异常,finally块中代码都会执行;
[2]. 当try和catch中有return时,finally仍然会执行(先讲try/catch中return之前的代码执行完(如果return中有代码,也要先于finally之前执行),再执行finally中的代码,然后再回到try/catch中执行return);
[3]. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的(finally部分可理解为另一次方法调用,finally中对变量的操作相当于其局部变量);
[4]. finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
如下列子:
public class MyTest
{
static int mainx=1;
public static void main(String[] args){
System.out.println("test() is returned,a="+test());
}
static int test(){
int a = 6;
int b = 0;
try { // try监控区域
if (b == 0) throw new ArithmeticException(); //抛出异常,后面代码不执行
a++;
return a;
}
catch (ArithmeticException e) { // catch捕捉异常
System.out.println("ArithmeticException,a="+a); //a=6
return (++a);//a=7,先执行(++a),再执行finally部分代码,保存a的值,作为返回值
}finally{
System.out.println("finally is called。a="+a); //a=7
a++;//a=8,可改变值,但对返回值无影响,类似于方法调用。
System.out.println("finally is called again。a="+a); //a=8
}
}
}
输出结果如下:
ArithmeticException,a=6
finally is called。a=7
finally is called again。a=8
test() is returned,a=7