这是一个问题,而不是一个问题。
我有一个名为 DSConnectionUtilExternal 的类,它具有一种检索数据库连接的方法和一种关闭它的方法。该类位于 jar 文件中。
另一方面,我有一个项目,其中包含 jar 文件作为依赖项。 在这个项目中我有这个代码
Connection con = null;
ResultSet rsGet = null;
PreparedStatement psGet = null;
try {
con = DSConnectionUtilExternal.openConnection();
psGet = con.prepareStatement("SELECT * FROM TEST");
rsGet = psGet.executeQuery();
int counter = 0;
while (rsGet.next()) {
counter++;
System.err.println(counter);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rsGet != null) {
rsGet.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
rsGet = null;
try {
if (psGet != null) {
psGet.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
psGet = null;
DSConnectionUtilExternal.closeConnection(con);
}
如果我删除jar文件中closeConnection方法的内容,sonar不会检测到连接未关闭。我认为这是正常的,sonar不会反编译jar文件来访问jar文件代码。
所以问题是? “资源应该关闭”规则使用什么标准来确定finally子句中的连接是否关闭?
谢谢
您的问题的正确假设:目前SonarJava(刚刚发布的4.11)不进行跨文件分析,并且不知道您的
closeConnection
方法中发生了什么。
但是,有关未关闭资源的规则有一个简单的启发式,以避免误报,如果将资源传递给名为
close
的方法,则认为资源已关闭。
SonarJava 正在能够读取您的 jar 文件并了解资源已关闭,但这是一个复杂的功能,我们希望在不久的将来提供它。