12.5.3 抛出和捕捉多个异常
有时候一个方法会抛出多种异常来指示不同类型的问题。如果这些都是受检异常,必须都列在方法的throws子句中,它们之间以逗号分开。比如:
|
异常处理器必须处理从它的受保护的语句中可能抛出的所有的受检异常,因此一个try语句可以有多个catch块,如代码清单12-11所示。注意每个catch块中可以用相同的变量名。
代码清单12-11 一个try语句中的多个catch块
|
当一个异常被try块中的一个方法调用所抛出时,catch块以书写的顺序依次检查异常的类型,直到有一个匹配为止。所以如果EOFException异常被抛出,那么控制就转移到第一个catch块;而如果FileNotFoundException异常被抛出,控制就转移到第二个catch块。一旦某个catch块执行到最后一句了,接下去就执行在最后一个catch块下面的语句。
如果有必要,多态性可以用来避免写很多catch块。不过这可能会加大实施类型相关的恢复操作的难度。在代码清单12-12中,一个catch块可以处理受保护语句中抛出的任何异常。这是因为异常匹配的过程只是看异常对象是否属于catch所要捕捉的类型。既然所有的的异常都是Exception类的子类,这个catch就会捕捉到任何异常(不论是受检还是不受检)。由于匹配过程的特点,在一个try语句中的各个catch块的顺序是有意义的。某个异常类型的catch不能在它的超类型的catch之后,因为前面的超类的catch块在子类的catch块做匹配检查之前一定会匹配到子类的异常对象。
代码清单12-12 在一个catch块中捕捉所有的异常
|
练习12-29 改进在练习12-26和练习12-27中写的try语句,使得它们在不同的catch块中处理受检异常和不受检异常。
练习12-30 下面的try语句有什么错?
|