java - Sonar 似乎忽略了 catch block 中设置的变量

标签 java sonarqube sonarlint false-positive

有谁知道为什么 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/

相关文章:

java - jBPM 是我需要的吗?

sonarqube - 使用 Sonar checkstyle 插件纪念 @SuppressWarnings

maven - SonarQube:如何分析曾经是另一个项目子模块的项目?

java - 使用多个套件进行测试。 @AfterSuite 方法在第一个套件和第二个套件无法运行后关闭驱动程序

java - 如何将 JSON 字符串转换为带有属性的 xml?

c# - SonarQube 分析 scss/sass 文件?

java - 如何使 Sonar 兼容 XMLInputFactory 和 woodstox 库注册的实现?

java - 此 Sonar 规则未触发

java - 如何在SonarQube 6.7中分析单元测试文件?

java - 一项 Activity 2 个按钮,可以进行不同的 Activity