7.2 异常处理机制

7.2 异常处理机制

Java异常处理机制是指当程序运行出现意外情况时,系统会自动生成一个Exception对象来通知程序,然后根据Exception对象的类型进入具体的异常处理模块。这样能够将业务实现模块和异常处理模块分离,提供更好的程序可读性。

Java异常处理机制的具体处理方式是,将可能发生异常的语句全部写在try{}中,当try语句块中的语句发生异常时,系统会生成一个异常对象,该异常对象会提交给Java运行时环境,这个过程称为“抛出异常”。

当Java运行时环境接收到异常对象时,会去寻找匹配可以处理该异常的catch语句块,如果找到适当的catch语句块,就把该异常对象交给此catch语句块处理,这个过程称为“捕获异常”。如果找不到适当的catch语句块处理该异常,该异常对象就抛给当前函数的调用者处理。

异常处理机制语句如下:

将所有可能抛出异常的业务处理语句写入try语句块中,如果执行的try语句块没有发生任何异常,则所有的catch语句块都不执行;如果执行try语句块时发生了异常,则抛出一个异常对象。运行时环境将此异常对象的类型依次和后面的catch小括号中的异常类进行匹配。如果抛出的异常对象的类型是catch小括号中的异常类或者其子类,那么该异常对象就传入该catch子句,然后执行该catch语句块中的异常处理语句,然后越过后续的所有catch语句块。如果抛出的异常对象的类型和catch小括号中的异常类不匹配,则依次与下一个catch语句块进行匹配。如果抛出的异常对象的类型和所有的catch异常类都不匹配,那么该异常对象将抛给当前方法的调用者,如果当前方法是main(),那么此异常对象将抛给操作系统,异常信息会输出在控制台上,当前程序结束。

例如,假设try中的语句2抛出了异常,则try中语句2之后的语句将不再执行。该异常对象的异常类型会依次和每个catch语句块匹配,先和第一个catch语句块的异常类1匹配,如果不是异常类1或者其子类,则接着和第二个catch语句块匹配。如果异常对象的异常类型和第二个异常类2匹配上了,则执行异常处理语句块2,之后的catch语句块会被越过。

无论有没有抛出异常,或者无论抛出的异常有没有没被catch异常对象的异常类型捕获到,finally语句块都会被执行。

注意:

(1)尽量对不同的异常给予具体不同的异常处理,而不是对不同的异常笼统地给予相同的处理。

(2)由于异常对象与catch语句块的匹配是按照catch语句块的先后顺序进行的,那么当处理多异常时,catch子句的排序顺序一般是将处理具体异常的catch子句放在前面,而可以与多种异常类型相匹配的catch子句放在后面。若子类异常的catch子句放在父类异常的catch子句的后面,编译会出错。catch子句应该将处理具体的子类异常排列在前面,将可以匹配多个异常的父类排列在后面。

(3)由于try语句块中抛出异常的语句之后的语句将不会被执行到,所以将一些一定需要执行的、不能忽略的语句写在finally语句块中。一般将一些资源清理操作(如文件关闭等操作)写在finally中。finally块是可选的。

(4)当catch语句块中包含System.exit(0)语句时,则不执行finally块,程序直接终止;当catch语句块中包含return语句时,则执行完finally块后再返回。

【代码7.1】异常案例1

对于代码7.1,若输入“2”,则运行结果如图1.7.1所示。

图1.7.1 输入“2”的运行结果

若输入“a”,则运行结果如图1.7.2所示。

图1.7.2 输入“a”的运行结果

【代码7.2】异常案例2

代码7.2的运行结果如图1.7.3所示。

图1.7.3 代码7.2的运行结果