无法到达的 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.