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();
}
}
使用此代码:
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();
}
}