有谁知道为什么SonarQube会检测到违反规则的行为"有条件执行的块应该可以访问" (squid:S2583)在以下示例中?这是误报吗?
在这段Java代码中,读取文件并在读取输入流的过程中发生EOFException
(或多个)。因此,捕获并处理异常,并设置一个标志以记住它发生。但是,Sonar不考虑第一个catch块中的行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;
}
}
为了更加清晰,请在throw new EOFException()
中添加try { }
,然后条件始终为真,Sonar仍声称它始终为假...
(我使用SonarQube 5.6.6和SonarJava插件4.13.0.11627)
答案 0 :(得分:2)
这似乎是SonarJava数据流分析过程中如何处理catch块的问题。不考虑在被调用方法的throws声明中声明的异常捕获子类型,因此引擎永远不会看到对变量的赋值。
我创建了以下故障单来解决此问题https://jira.sonarsource.com/browse/SONARJAVA-2483