Eclipse 4发出一条警告,指出stmt
可能无法关闭并导致资源泄漏:
class Test {
public void test() {
PreparedStatement stmt = null;
try {
stmt = HibernateSession.instance().connection().prepareStatement("");
} catch (final SQLException e) {
e.printStackTrace();
} finally {
if (stmt != null)
try {
stmt.close();
} catch (final SQLException e) {
e.printStackTrace();
}
}
}
}
在哪种情况下会发生这种情况?
答案 0 :(得分:2)
我想这里的结论是:这是一个Eclipse bug?
答案 1 :(得分:-1)
如果在stmt.close()
块中调用finally
时抛出异常,则可能发生泄漏。
答案 2 :(得分:-1)
问题是在finally
阻止中可能会发生异常,这会阻止stmt
关闭。
一种解决方法是您可以使用以下内容替换finally
块中的所有内容:
JDBCUtilities.close(stmt);
请参阅JDBCUtilities.close
null
。如您所见,使用此实用程序方法不会抛出任何异常,因此您无需担心资源泄漏。另一个好处是实用程序方法也处理stmt
JDBCUtilities
的情况,因此我们不需要自己编写代码。
实际上,{{1}}使用{{1}}。
答案 3 :(得分:-2)
您需要使用Java 7尝试使用资源或try-finally块:
try(stmt = HibernateSession.instance().connection().prepareStatement("")) {
}
将在不保证关闭的AutoCloseable
继承的类型上生成此警告。 (或者可能Closeable
,我忘记了哪一个。)
现在我看到你在问什么,只需写下不那么复杂的代码。
Foo f = null; // don't do this, but it's what you're doing
f = new Foo();
你正在做什么,并且你发现了几种情况中的一种情况,你实际上必须为这种无关的工作付出代价。
此外,您的try/finally
应该干净。 .close()
不能扔,你为什么要抓?
try { // don't do this
stmt.close();
}
catch(SQLException exc) {
}
应该生成一个Eclipse警告,告诉您正在捕捉一些不会抛出的东西。这甚至可能是一个编译错误,不确定,但听起来你会从使用Eclipse>中受益。偏好>编译并查看哪些警告是智能的。如果你不理解警告,请谷歌并查看它是否对你有所帮助,不要只是跳过它。 (有点像你对这个做的那样)。