我想找到一种提示SonarQube的方法,以免对某些代码段发出警告。
示例1:“可以删除空语句块”-实际上,不能将其删除:
static void closeNX (java.io.FileInputStream is) {
try {
is.close ();
} catch (Exception e) {} <Warning comes here>
}
(编辑:当is.read
或is.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
但没有{{1} }确实保证,如果用户不调用finalize
/ close
)
答案 0 :(得分:1)
要使消息静音,您可以通过配置quality profile来配置SonarQube中启用了哪些规则,也可以为特定文件添加an exclusion。
第三种方法是在问题所在行添加// 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