【问题标题】:How does the rule "Resources should be closed" check that a connection is closed?“应关闭资源”规则如何检查连接是否已关闭?
【发布时间】:2017-07-07 16:54:45
【问题描述】:

这是一个问题,不是问题。

我有一个名为 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没有反编译jar文件来访问jar文件代码。

所以问题是? “资源应该关闭”规则在finally子句中判断连接是否关闭的标准是什么?

谢谢

【问题讨论】:

  • 你有充分的理由不使用 try-with-resources 吗?
  • 使用的标准是引用类型是否实现 (Auto)Closeable 接口:您要么必须显式地close() 它,要么使用 try-with-resources。
  • 如果您愿意对您的问题进行拼写检查,那么您被认真对待的可能性就会大得多。

标签: java sonarqube


【解决方案1】:

您的问题的正确假设:目前 SonarJava(刚刚发布的 4.11)不进行跨文件分析,也不知道您的 closeConnection 方法中发生了什么。

但是,关于未关闭资源的规则有一个简单的启发式,以避免误报,如果将资源传递给名为 close 的方法,则认为资源已关闭。

SonarJava 正在努力读取您的 jar 文件并了解该资源在此处已关闭,但这是一个复杂的功能,我们希望在不久的将来提供它。

【讨论】:

  • 嗨@benzonico。非常感谢您的回答。现在很清楚了。
  • 为了历史,如果正确,请接受答案。
  • 您好@benzonico,请出示 jira 票或其他东西来跟踪此活动吗?
  • 与开发人员可以简单覆盖的误报相比,误报的影响太大了。
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 2010-11-26
  • 2017-12-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多