SonarQube——可以通过提示使其静音吗?

SonarQube -- can it be silenced with a hint?

我想找到一种方法来提示 SonarQube,这样它就不会对某些代码片段发出警告。

Example1: "empty statement block can be removed" -- 实际上是无法删除的:

static void closeNX (java.io.FileInputStream is) {
    try {
        is.close ();
    } catch (Exception e) {} <Warning comes here>
}

(编辑:当 is.readis.write 已经抛出异常时调用此方法,因此不再需要来自 is.close 的任何异常。)

示例 2:finalize 已弃用,因为即使您的库的用户忘记调用 close/dispose,内存最终也会被释放——但是本机资源(已打开文件,套接字,IPC,等等)不会被释放,这就是为什么例如 java.io.FileInputStream 确实有 finalize 方法:

protected void finalize() throws IOException {
    if ((fd != null) &&  (fd != FileDescriptor.in)) {
        close();
    }
}

(编辑:即使有 finalize 也不能保证如果用户不调用 close/dispose 将释放本机资源;但没有 finalize 确实保证如果用户不调用 close/dispose)

则原生资源不会被释放

要使消息静音,您可以通过为特定文件配置 quality profile, or you can add an exclusion 来配置在 SonarQube 中启用哪些规则。

第三种方法是在有问题的行上添加// NOSONAR评论。但是,通过这种方式您可以忽略所有规则。

现在关于您提供的示例 - 无法删除空的 catch 块,但是,它被认为是代码异味。也许至少应该记录一个异常?更多讨论请看这里 Why are empty catch blocks a bad idea?

对于finalize,使用它们来释放资源不是一个好主意,因为无法保证finalize 何时被调用或者是否会被调用。最好显式释放资源,而不是依赖垃圾回收来调用 finalize。您可以在 JDK 中检查这些错误,为什么甚至 Java 作者也不喜欢在 java.io.FileInputStream https://bugs.openjdk.java.net/browse/JDK-8187325 , https://bugs.openjdk.java.net/browse/JDK-8212050

中使用 finalize