在哪种情况下这种资源会泄漏?

时间:2013-02-27 00:58:24

标签: java eclipse

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();
                }
        }
    }
}

在哪种情况下会发生这种情况?

4 个答案:

答案 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>中受益。偏好>编译并查看哪些警告是智能的。如果你不理解警告,请谷歌并查看它是否对你有所帮助,不要只是跳过它。 (有点像你对这个做的那样)。