CodeQL 文档

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

点击查看 CodeQL 代码库中的查询

无法到达的 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*/ } }
}

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私