253
技术社区[云栖]
《数据结构与抽象:Java语言描述(原书第4版)》一JI2.2.3 多个catch块
本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第2章 [美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 着 罗得岛大学 新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
JI2.2.3 多个catch块
单个try块中的语句,可能抛出不同类型异常中的任意一个。例如,假定JI2.2.2节中的try块中的代码抛出多个类型的受检异常。在这个try块后的catch块能捕获IOException类和从IOException类派生的任意类的异常。要捕获其他类型的异常,可以在try块后写多个catch块。当抛出一个异常时,catch块出现的次序很重要。按出现的次序,其参数与异常的类型相匹配的第一个catch块后的语句将被执行。
不好的catch块次序。例如,下列catch块的次序不好,因为用于FileNotFoundException的catch块永远不会执行:
按照这个次序,任何I/O异常都将被第一个catch块所捕获。因为FileNotFoundException派生于IOException,所以FileNotFoundException异常是IOException异常的一种,将与第一个catch块的参数相匹配。幸运的是,编译程序可能对这个次序给出警告信息。
好的catch块次序。正确的次序是将多个具体异常放在其祖先类的前面,如下所示:
**程序设计技巧**:因为受检异常和运行时异常的类都以Exception为祖先,所以避免在catch块中使用Exception。而是,尽可能地捕获具体的异常,且先捕获最具体的
**程序设计技巧**:如果可能,避免嵌套的try-catch块
虽然在try块或catch块中再嵌套try-catch块是合法的,但应该尽可能地避免这样做。先看看能不能用不同的逻辑来组织代码以避免嵌套。如果不行,将内层块移到在外层块中调用的新方法中。
如果必须嵌套try-catch块,则可遵循以下指南。当一个catch块出现在另一个catch块中时,它们必须使用不同的标识符表示各自的参数。如果计划在try块内嵌套try-catch块,那么若外层catch块处理了相关的异常,则可以忽略内层的catch块。这种情形下,内层try块抛出的异常被外层try块捕获。
最后更新:2017-06-26 18:32:03