声纳似乎忽略了 catch 块中设置的变量

Sonar seems to ignore variables set in catch block

有谁知道为什么 SonarQube 在以下示例中检测到违反规则 "Conditionally executed blocks should be reachable" (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;
    }
}

为了更清楚,在 try { } 中添加一个 throw new EOFException(),然后条件将 always 为真,Sonar 仍然声称它总是假的...

(我正在使用 SonarQube 5.6.6 和 SonarJava 插件 4.13.0.11627)

这似乎是在 SonarJava 中数据流分析期间如何处理 catch 块的问题。 Catch 块捕获在被调用方法的 throws 声明中声明的异常的子类型,因此引擎永远不会看到对变量的赋值。

我创建了以下工单来解决这个问题https://jira.sonarsource.com/browse/SONARJAVA-2483