有谁知道为什么 SonarQube 在以下示例中检测到违反规则“条件执行的 block 应该可达”( squid:S2583 )?这是误报吗?
在这段Java代码中,读取一个文件,并且在读取输入流的过程中可能会发生一个EOFException
(或多个)。因此,异常被捕获并处理,并且设置一个标志来记住它发生了。但是,Sonar 不会考虑第一个 catch block 中的行 exHappened = true;
并声明该变量始终为 false
:
public static boolean doSomething() {
boolean exHappened = false;
try (DataInputStream s = new DataInputStream(new FileInputStream("test"))) {
LOGGER.info("Doing something...");
}
catch (EOFException eof) { // this Exception can definitely happen
exHappened = true;
}
catch (IOException io) {
LOGGER.error("sorry", io);
}
if (exHappened) { // Sonar thinks this condition is always false
return false;
}
else {
return true;
}
}
为了更清楚,在 try { }
中添加一个 throw new EOFException()
,那么条件将始终正确,而 Sonar 仍然声称它总是错误的......
(我正在使用 SonarQube 5.6.6 和 SonarJava 插件 4.13.0.11627)
最佳答案
这似乎是 SonarJava 中数据流分析期间如何处理 catch block 的问题。不考虑捕获被调用方法的 throws 声明中声明的异常子类型的 Catch block ,因此引擎永远不会看到对变量的赋值。
我创建了以下票证来解决此问题 https://jira.sonarsource.com/browse/SONARJAVA-2483
关于java - Sonar 似乎忽略了 catch block 中设置的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300600/