3

我有这样的代码:

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 将其识别为OBL_UNSATISFIED_OBLIGATIONJDBC Statement 对象。这是误报吗?我的印象是 try-with-resources 将确保这些资源在所有情况下都能正确关闭。

4

2 回答 2

3

正如您正确声明的那样,您的 ResultSet 和 PreparedStatement 受到保护。

如果您的 Connection 在相关范围内也得到了适当的处理,那么是的,这是一个误报。

于 2017-12-12T16:19:31.273 回答
0

有问题的情况绝对是误报。

Spotbugs 存在多个问题(截至 3.1.5):

  1. AutoCloseableSpotBugs 报告了 try-with-resources 中使用的对象(误报):

  2. 还有一个与ResultSetand相关的问题Statement(“关闭语句隐式关闭从它获得的结果集”):

于 2018-06-21T20:51:53.377 回答