SpotBugs 是否报告了未在此处关闭资源的误报?
Is SpotBugs reporting a false positive on not closing a resource here?
我有这样的代码:
public static MyObject forId(long myObjectId, Connection cxn) throws SQLException {
try (PreparedStatement stmt = cxn.prepareStatement(selectMyObjectById))) {
stmt.setLong(1, myObjectId);
try (ResultSet res = stmt.executeQuery()) {
res.next();
return MyObject.fromResultSet(res);
}
}
}
SpotBugs 将 JDBC 语句对象标识为 OBL_UNSATISFIED_OBLIGATION
。这是误报吗?我的印象是 try-with-resources 将确保这些资源在所有情况下都能正确关闭。
正如您正确声明的那样,您的 ResultSet 和 PreparedStatement 受到保护。
如果您的连接也在相关范围内得到适当处理,那么是的,这是误报。
所讨论的场景绝对是误报。
Spotbugs 存在多个问题(截至 3.1.5):
AutoCloseable
尝试资源中使用的对象被 SpotBugs 报告(误报):
还有一个问题专门与 ResultSet
和 Statement
("closing a statement implicitly closes the result set obtained from it") 相关:
我有这样的代码:
public static MyObject forId(long myObjectId, Connection cxn) throws SQLException {
try (PreparedStatement stmt = cxn.prepareStatement(selectMyObjectById))) {
stmt.setLong(1, myObjectId);
try (ResultSet res = stmt.executeQuery()) {
res.next();
return MyObject.fromResultSet(res);
}
}
}
SpotBugs 将 JDBC 语句对象标识为 OBL_UNSATISFIED_OBLIGATION
。这是误报吗?我的印象是 try-with-resources 将确保这些资源在所有情况下都能正确关闭。
正如您正确声明的那样,您的 ResultSet 和 PreparedStatement 受到保护。
如果您的连接也在相关范围内得到适当处理,那么是的,这是误报。
所讨论的场景绝对是误报。
Spotbugs 存在多个问题(截至 3.1.5):
AutoCloseable
尝试资源中使用的对象被 SpotBugs 报告(误报):还有一个问题专门与
ResultSet
和Statement
("closing a statement implicitly closes the result set obtained from it") 相关: