无法到达的 catch 子句¶
ID: java/unreachable-catch-clause
Kind: problem
Security severity:
Severity: warning
Precision: high
Tags:
- reliability
- correctness
- exceptions
- external/cwe/cwe-561
Query suites:
- java-security-and-quality.qls
无法到达的 catch 子句可能表明异常处理代码中的逻辑错误,或者可能仅仅是不必要的。
虽然某些无法到达的 catch 子句会导致编译器错误,但也有不会导致编译器错误的无法到达的 catch 子句。如果以下两个条件都为真,则编译器认为 catch 子句 C 可到达
在
try块中抛出的已检查异常可分配给C的参数。没有以前的
catch子句,其参数类型等于或为C的参数类型的超类型。但是,如果以下两个条件都为真,则编译器认为可到达的catch子句可能无法到达catch子句的参数类型E不包含任何未检查的异常。在
try块中抛出的类型为E的(严格)子类型的所有异常都已由以前的catch子句处理。
建议¶
确保不可达的 catch 子句被移除或进行进一步的修正使其可达。
请注意,如果 try-catch 语句包含多个 catch 子句,并且在 try 块中抛出的异常与多个 catch 子句匹配,则只执行第一个匹配的子句。
示例¶
在以下示例中,第二个 catch 子句不可达。代码不完整,因为 FileOutputStream 被打开,但没有调用任何方法写入流。这些方法通常会抛出 IOException,这将使第二个 catch 子句可达。
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File("may_not_exist.txt"));
} catch (FileNotFoundException e) {
// ask the user and try again
} catch (IOException e) {
// more serious, abort
} finally {
if (fos!=null) { try { fos.close(); } catch (IOException e) { /*ignore*/ } }
}
参考资料¶
Java 语言规范:try-catch 的执行,不可达语句.
帮助 - Eclipse 平台:Java 编译器错误/警告首选项.
通用弱点枚举:CWE-561.