java - 规则 "Resources should be closed"如何检查连接是否已关闭?

标签 java sonarqube

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

我有一个名为 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 文件并了解资源已关闭,但这是一个复杂的功能,我们希望在不久的将来提供它。

关于java - 规则 "Resources should be closed"如何检查连接是否已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44965791/

相关文章:

java - 使用数据提供程序时如何在测试后重新启动浏览器

java - SonarQube 与 Apache Commons Lang3 中的 Validate 类

java - 用于检查代码是否包含非 UTF-8 字符的正则表达式?

jenkins - 同一台机器上有 2 个 Sonar 实例

java - 找不到 Json 对象(使用 org.json)

没有循环或 if 语句的 Java 字符串搜索?

java - Android Studio map 重置为默认 View 应用程序重新启动

ssh - 通过 ssh 使用 svn 时,SCM 传感器失败并显示 E170001

java - 使用通用测试数据扫描 Sonarqube 6.4 中 ruby​​ 文件的覆盖率数据

java - 换行符对计算机意味着什么