当前位置: 首页 > 知识库问答 >
问题:

SonarLint仍然显示阻止程序错误,即使我们处理了该语句,连接在finally block中关闭

壤驷睿
2023-03-14

SonarLint显示以下错误:

  1. '使用try with resources或在“finally”子句中关闭此“语句”。'
  2. '使用try with resources或在“finally”子句中关闭此“连接”。'<即使我们关闭了finally block中的语句stmt,Connection con,阻塞器也会出错

请查找示例代码。

public String getProductNumber() throws BusinessDelegateException {

        String productNo = null;
        Connection con = null;
        Statement stmt = null;
        ResultSet   rs  = null;
        String query  = //some query
        try {
            DataSource ds = getDataSource();
            con = ds.getConnection();
            stmt = con.createStatement();
            rs   = stmt.executeQuery(query);
            productNo =.......
            ....................
        }catch (Exception e) {
            String errorMsg = "Error occured in getProductNumber()";
            throw new BusinessDelegateException(errorMsg, e);
        }finally{
            try {
                if(rs != null)
                    rs.close();
                if (stmt != null)
                    stmt.close();
                if (con != null)
                    con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return productNo;
    }

我们可以通过以下方式修改finally块来解决这个问题。但它似乎仍然像是接球拦网的重复。我们还有别的办法解决这个问题吗?

finally{
        try {
            if(rs != null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (stmt != null)
                stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (con != null)
                con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

共有2个答案

夏博
2023-03-14

使用Try with资源。这是最好的选择。

臧兴学
2023-03-14

如果不尝试使用资源,您只能通过使用可重用的方法来改进代码,请调用main方法:

closeResources(rs, stmt, con);

它将为每个资源调用不同的方法,例如语句:

 public void closeResource(Statement stmt) {
    if (stmt != null) {
        stmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

顺便说一句,你最好使用logger而不是e.printStackTrace()

对于完整的解决方案,您可以检查在数组中添加资源并在循环中关闭它们的广泛示例:

for (Closeable resource : resources) {
   try {
     resource.close();
 类似资料:
  • 我正在使用MySQL工作台(5.6.19)。它有几个连接,其中我要访问的表位于“Connection1”(连接名称)中。连接主机:122.0.0.0。我的数据库名是“sorder”。user=“root”,password=“password”,port=3306。 这是我的一段代码: 我的驱动程序连接失败。另外,我不确定我的路径Strin url应该是什么,因为mySQL workbench中有

  • 所以我已经实现了一个Spring引导JAVA应用程序作为服务器和角作为前端。所以实际上,当我在本地运行这些时,一切都很好。 但是当我为两者构建Docker映像并尝试将它们作为容器进行测试时,我面临着CORS错误。 由于我使用JWT令牌作为安全性,我已经禁用了crsf和默认的Spring Security令牌。所以在这里您可以看到CORS的JAVA配置; 这就是nginx。形态 即使我尝试在同一网络

  • 我正尝试在出现连接错误时添加一个控件。我的目的是通过捕捉异常来阻止程序抛出异常。 但它会在控制台中打印: 抱歉,如果我打印了太多的StackTrace... 我想知道,如果我不打印出stacktrace,我如何使异常消失?谢谢:)

  • 问题内容: 查询1打开15个连接,执行后将关闭它们。但是将永远不会执行,因为它包含等待自由连接的内容。 如何解决这个问题呢? 问题答案: 你有一个僵局。在最坏的情况下,您有15个goroutine持有15个数据库连接,而所有这15个goroutine都需要一个新的连接才能继续。但是要获得新的连接,就必须前进并释放一个连接:死锁。 链接的维基百科文章详细介绍了防止死锁的方法。例如,代码执行仅在拥有需

  • 我在这里遇到了一些非常奇怪的事情,当我输入“mvn clean install”时,我在maven中的构建是成功的,但是一旦导入到Eclipse中,它就会显示错误。 亲眼看看: 我想从pom.xml中排除石英解决了这个问题,但我想知道为什么。 PS:这是,如果您想看到它:

  • 错误处理 有些方法通通过参数返回 error 的引用,使用这样的方法时应当检查方法的返回值,而非 error 的引用。 推荐: NSError *error = nil; if (![self trySomethingWithError:&error]) { // Handle Error } 此外,一些苹果的 API 在成功的情况下会对 error 参数(如果它非 NULL)写入垃圾值(