首页 理论教育 多异常的捕获和处理

多异常的捕获和处理

时间:2022-02-28 理论教育 版权反馈
【摘要】:每次执行try语句时,至多只能有一个异常处理代码被执行。如果try子句产生的异常对象被第一个catch块捕获,则程序的流程将直接跳转到这个catch子句块中,该catch子句执行完毕后,如果没有finally子句,就退出整个try语句,执行try语句后面的Other Statements语句。try子句内的语句发生异常,但是所有的方法都不能捕获该异常对象,即没有被任何catch子句捕获。现编程使用多个catch子句,模拟上课过程中异常情况的处理。

8.4.2 多异常的捕获和处理

try子句内的代码可能会发生多种类型的异常。每次执行try语句时,至多只能抛出一个异常。

try语句也允许有多个catch子句,每个catch子句可以捕获一种类型的异常。每次执行try语句时,至多只能有一个异常处理代码被执行

存在多个catch子句时,程序执行的流程也分为三种情况:

(1)try子句内的语句没有发生任何异常,如果没有finally子句,那么跳过所有的catch子句,直接执行try语句后面的语句Other Statements。

(2)如果try子句产生的异常对象被第一个catch块捕获,则程序的流程将直接跳转到这个catch子句块中,该catch子句执行完毕后,如果没有finally子句,就退出整个try语句,执行try语句后面的Other Statements语句。而try子句中尚未执行的语句和其他尚未捕获的catch子句将被忽略;如果try子句产生的异常对象不能被第一个catch子句捕获,系统将按catch子句编写次序判断第二个catch子句,如果第二个catch子句不能捕获该异常对象,就转向第三个catch子句进行判断;直到找到一个可以捕获该异常对象的catch子句。如果所有的catch子句都不能捕获该异常对象,那就表明该方法不能捕获这个异常对象,程序流程将返回到调用方法上。

(3)try子句内的语句发生异常,但是所有的方法都不能捕获该异常对象,即没有被任何catch子句捕获。这种情况将在没有被捕获的异常小节里专门论述。

因此,catch子句的排列应该是:先特殊后一般或先子类后父类,但只捕获一次。即处理子类型异常的catch子句一定要放在处理超类型异常的catch子句之前,否则,处理子类型异常的处理代码就没有机会被执行。

注意:(1)如果将一个处理超类型异常的catch子句放在处理子类型异常的catch子句之前,或者两个catch子句捕捉同一类型的异常,编译系统都将给出错误信息。

(2)不同的catch子句是不同的作用域,不能访问其他catch子句定义的局部变量。

(3)在catch子句中不能访问try子句中声明的局部变量

【例8-11】 多个catch子句的举例。

img518

img519

命令行没有输入参数而直接运行的结果是:

img520

分析与思考:因为命令行没有输入参数,所以args.length=0,进而a=0,引发除零异常。

命令行输入任意参数(如“abc”)后的运行结果是:

img521

分析与思考:因为命令行输入一个参数“abc”,所以args.length=1,进而a=1,就不会引发除零异常。而数组c初始化后,只能有一个元素。因此,c[4]引发数组下标越界异常。

【例8-12】 一个学生在上学过程中,可能会受到许多意外情况的干扰而影响正常学习,如学生有病或学习态度、学习方法问题,教师教学水平问题,教材教学大纲的设置问题,多媒体设备故障等教学设施问题。现编程使用多个catch子句,模拟上课过程中异常情况的处理。每种意外情况都自定义为异常类。

img522

img523

下面是一种可能的运行结果:

FacilityException:教学设施问题!多媒体设备故障等需学校自己解决。

分析与思考:(int)(Math.random()*5)生成随机数(0~4),模拟各种可能的情况。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈