java - 通过finally block 中的方法关闭其他类中的连接对象

标签 java resources connection sonarqube finally

我正在使用 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);
            } 
        }
    }
} 

这是我关心的列表:

  1. 由于这个现有的实现正在做正确的事情(如果我错了,请纠正我),它确实需要根据 Sonar 建议更改代码。

  2. 如果我真的需要遵循 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/

相关文章:

java - 如何在其他应用程序打开或使用文件时写入文件?

java - 从 Java 中的文本文件获取设置

java - 检查 HttpServletRequest 的连接是否仍然打开?

node.js - 如何关闭 Node.js http.createClient 的连接?

Java获取List中的数组

java - 如何使用反射从外部获取对匿名内部类方法 'helloWorld' 的引用

java - 显示数字阶梯金字塔

iPhone SDK - 在资源中添加压缩内容,然后解压缩到 Documents 文件夹中

spring - 如何使用maven资源过滤来过滤特定文件

http - 在没有提供 BES 和 APN 的情况下,RIM 联盟合作伙伴计划是黑莓应用程序的唯一选择吗?