我正在使用 Sonar 工具来分析现有应用程序中的编码标准,其中我遇到了 Sonar 规则:“关闭资源”,其中 Connection 的对象 conn 是罪魁祸首。
正如我们所知,我们应该使用 conn.close(); 关闭 Connection 对象,但在应用程序中已经调用了释放连接的方法。
下面是通过finally block 中名为releaseConnection()
的方法关闭Connection对象的代码段。
finally {
try {
OtherClass.releaseConnection(conn); // Line: 50 Here is the call to close the conn
}
catch (SomeException se) {
LOGGER.error(" Exception while releaseConnection in add() method : ",se);
}
}
关闭方式:
public static void releaseConnection(Connection conn) throws DBException {
if (conn!=null) {
try {
if (!conn.isReadOnly()){
conn.commit();
}
} catch (SQLException e) {
LOGGER.error("Error while commiting the connection. " + e);
rollback(conn);
throw new SomeException(e,SOMETHING);
} finally {
try {conn.close();} catch (SQLException se){
LOGGER.error("releaseConnection() Error " + se);
}
}
}
}
这是我关心的列表:
由于这个现有的实现正在做正确的事情(如果我错了,请纠正我),它确实需要根据 Sonar 建议更改代码。
如果我真的需要遵循 Sonar 的建议,最好的方法是什么。
更新:
我怎样才能忽略/绕过某些特定的代码或规则并应用到我的上面的代码中。 假设我想忽略 Line: 50,我该怎么做?
我不想弄乱上面的代码,但我真的想忽略它并减少我的问题。提前致谢。
最佳答案
您实际上遇到了符号执行引擎的限制(该规则在幕后使用该引擎):https://jira.sonarsource.com/browse/SONARJAVA-1591
这里发生的情况是,我们通过跳过整个 try block 的执行路径(以简化流程的处理)来近似 try/catch/finally 中的执行流程,这会导致您提到的误报,因为我们没有看到对您的方法的调用会阻止引发问题。
关于java - 通过finally block 中的方法关闭其他类中的连接对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36147910/