在下面的示例中,有谁知道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 { }
,条件将始终为true,而Sonar仍然声称其始终为false ...(我正在使用SonarQube 5.6.6和SonarJava插件4.13.0.11627)
最佳答案
在SonarJava中进行数据流分析期间,如何处理catch块似乎是一个问题。不会考虑在被调用方法的throws声明中声明的异常的catch块捕获子类型,因此引擎永远不会看到对变量的分配。
我创建了以下票证来解决此问题https://jira.sonarsource.com/browse/SONARJAVA-2483
关于java - Sonar 似乎忽略了catch块中设置的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46300600/