"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。所以UnitOfWork
close()
方法里面是这样的
@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;
}
}
}
我的代码部分如下所示:
try (UnitOfWork unitOfWork = datasource.getConnection()) {
ResultSet resultset = untiOfWork.getStatement().getResultSet();
unitOfWork.queueToClose(resultSet);
...
}
UnitOfWork 是一个 AutoClosable。所以UnitOfWork
close()
方法里面是这样的
@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;
}
}
}