10.3.2 捕获异常

10.3.2 捕获异常

捕获异常是通过try-catch-finally语句实现的。

语句try是提供给java程序处理异常情况的一种机制。try包含一个可执行的程序代码区块(block),表示有异常情况时将会得到适当的处理。一个try语句可包含数个选用的catch子句,可处理不同的的例外情况。try语句也可包含一个finally子句,不管如何,当控制权要退出try语句之前一定要执行finally子句的区块,try语句最少必须跟随一个catch或finally子句,两个都有当然可以。try语句语法图如图10-3所示。

img435

图10-3 try语句语法图

img436

img437

1.try

捕获例外的第一步是用try{…}选定捕获例外的范围,由try所限定的代码块中的语句在执行过程中可能会生成例外对象并抛弃。try模块中的语句是程序正常流程要执行的语句,但是在执行过程中有可能出现异常。

2.catch

每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件。catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable类或其子类,运行时系统通过参数值把被抛弃的异常对象传递给catch块。

在catch块中是对异常对象进行处理的代码,与访问其他对象一样,可以访问一个异常对象的变量或调用它的方法。getMessage()是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。例如:

img438

catch 语句的顺序:

捕获异常的顺序和catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。

3.finally

捕获例外的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其他部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。

【例10-1】从键盘上读入一行信息,根据读入的内容来判定是否发生了异常。如果读入的是空串,则抛出EmptyStringException()异常;如果读入的内容中含有数字,则抛出IncludeNumberException()异常。程序中用到了String的indexOf()函数,它返回参数所指定的字符在字符串中第一次出现的位置。如果这个位置大于等于0,表明字符串中含有该字符。程序中使用循环来查找是否出现0~9这10个数字。

程序中使用了finally语句,输出一条信息:Exception example end。

程序设计如下:

img439

img440

该程序的执行结果为:

img441

那么当读入的内容不抛出异常时,将执行System.exit(0)语句,从程序中读出,此时不会输出Exception example end信息。但当抛出异常时,程序转去处理异常,这样就会绕过System.exit(0)语句,根据异常的类型执行不同的操作,并在最后输出Exception example end信息。添加了System.exit(0)语句后的执行结果如下所示。

img442