"obl_unsatisfied_obligation" 可能的 Findbug 误报

Possible Findbug false positive for "obl_unsatisfied_obligation"

我的代码部分如下所示:

try (UnitOfWork unitOfWork = datasource.getConnection()) {
    ResultSet resultset = untiOfWork.getStatement().getResultSet();
    unitOfWork.queueToClose(resultSet);
    ...
}

UnitOfWork 是一个 AutoClosable。所以UnitOfWorkclose()方法里面是这样的

@Overide
public void close() {
    for (AutoClosable closable : queueToClose) {
        closable.close();
    }
    connection.close();
} 

现在 FindBug 抱怨 ResultSet 没有被关闭。这是误报吗?这是一个错误的模式吗?

ResultSet 将被关闭的意义上来说,这是一个误报,但 FindBugs 无法知道这一点。

这也是一个糟糕的模式:如果您在获得 ResultSet 后忘记调用 queueToClose 会怎样? UnitOfWork.getStatement() 是否在返回之前将语句添加到 queueToClose

更好

try (UnitOfWork unitOfWork = datasource.getConnection();
     Statement statement = unitOfWork.getStatement();
     ResultSet resultset = statement.getResultSet()) {
    ...
}

除了 'Alexey Romanov' 发布的出色答案之外,您的 UnitOfWork.close 实现中可能存在泄漏,如果这些关闭调用中的任何一个抛出异常,您的连接就不会关闭。

@Override
public void close() throws Exception {
    Exception first = null;
    try (AutoCloseable requiredForJdk8 = this.connection) {
        for (AutoCloseable closable : this.queueToClose) {
            try {
                closable.close();
            } catch (Exception e) {
                if (first == null) {
                   first = e; 
                } else {
                    if (first != e) {
                        first.addSuppressed(e);
                    }
                }
            }
        }
        if (first != null){
            throw first;
        }
    }
}