在我们的代码库中,我们得到Sonar报告规则squid的违规行为:S2095代码如下:
PreparedStatement ps = null;
try {
ps = connection.prepareStatement(DML);
ps.setString(1, externalDeviceId);
ps.setInt(2, internalDeviceId);
ps.execute();
return ps.getUpdateCount() > 0;
} finally {
Utilities.close(ps);
}
将Utilities.close实现为
public static final void close(final AutoCloseable ac) {
if(ac != null) {
try {
ac.close();
} catch(Exception e) {
}
}
}
有没有办法避免这些误报?
答案 0 :(得分:4)
如果你使用Java 7+,有一种非常简单的方法可以使用try-with-resources来关闭资源本身,你不必再关心它了。请参阅try (PreparedStatement ps = connection.prepareStatement(DML)),教程:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
try (PreparedStatement ps = connection.prepareStatement(DML)) {
ps.setString(1, externalDeviceId);
ps.setInt(2, internalDeviceId);
ps.execute();
return ps.getUpdateCount() > 0;
}
答案 1 :(得分:3)
简短回答,暂时没有办法避开这些。
更长的回答: 通常,将打开的值传递给方法应将其标记为已关闭以避免误报。你应该准确地使用你正在使用的声纳java插件版本。
此规则依赖于符号执行引擎,并且仅限于方法的边界,因此,目前无法确定对此实用程序方法的调用肯定会关闭打开的资源。
但请注意,声纳java团队正在努力使此限制消失。