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):

  1. AutoCloseable 尝试资源中使用的对象被 SpotBugs 报告(误报):

  2. 还有一个问题专门与 ResultSetStatement ("closing a statement implicitly closes the result set obtained from it") 相关: