Sonarlint 多次关闭

Sonarlint multiple closes

使用此代码:

Connection connection = null;
PreparedStatement req = null;
try {
   connection = DriverManager.getConnection(url, user, password);
   req = connection.prepareStatement(SQL);
} finally {
   if (connection != null) {
      connection.close();
   }
   if (req != null) {
      req.close();
   }
}

SonarLint 说:

Close this "PreparedStatement" in a "finally" clause on line 5 (req = ...)

当我先关闭 req 时:

Close this "Connection" in a "finally" clause on line 4 (connection = ...)

如何让 SonarLint 开心?

假设您正在使用 java.sql.Connection,您的代码仍可能以资源在执行结束时未关闭而告终。

如果您查看 Java 6 javadoc 中的 Connection.close() 方法签名,您会发现它可以抛出 SQLException。因此,由于您已经在 finally 块中,并且如果在关闭时发生异常,您的代码将退出该方法而不关闭请求。

现在,如果您颠倒关闭顺序并从请求开始,同样的事情也会发生。调用 close() 可能会失败,然后连接永远不会关闭,因为您从 finally 块开始再次直接跳到方法之外。

为了正确关闭这两个资源,我建议这样处理:

Connection connection = null;
try {
  connection = DriverManager.getConnection(url, user, password);
  PreparedStatement req = null;
  try {
    req = connection.prepareStatement(sql);
  } finally {
    if (req != null) {
      req.close();
    }
  }
} finally {
  if (connection != null) {
    connection.close();
  }

}