gpt4 book ai didi

java - 即使我们已经处理了语句,SonarLint 仍然显示阻塞错误,Connection closes in finally block

转载 作者:行者123 更新时间:2023-12-05 07:33:34 24 4
gpt4 key购买 nike

SonarLint 显示以下错误:

  1. “使用 try-with-resources 或在“finally”子句中关闭此“语句”。”
  2. '使用 try-with-resources 或在“finally”子句中关闭此“连接”。'
    阻塞错误,即使我们已经关闭了 Statement stmt,Connection con in finally block 。

请找到示例代码。

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 block 来解决这个问题。但它似乎仍然是 catch block 的重复。我们还有其他方法可以解决这个问题吗?

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();
}
}

最佳答案

如果没有 try-with-resources,你只能通过使用可重用性方法来改进代码,调用 main 方法:

closeResources(rs, stmt, con);

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

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

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

完整的解决方案可以查看extensive example在数组中添加资源并在循环中关闭它们:

for (Closeable resource : resources) {
try {
resource.close();

关于java - 即使我们已经处理了语句,SonarLint 仍然显示阻塞错误,Connection closes in finally block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com