5

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

4 に答える 4

2

ここでの結論は次のとおりです。これはEclipseのバグですか?

于 2013-02-27T03:21:59.093 に答える
-1

ブロックを呼び出すときに例外がスローされると、リークが発生する可能性がありstmt.close()ます。finally

于 2013-02-27T01:24:46.530 に答える
-1

問題は、finallyブロックで例外が発生する可能性があり、それがstmt閉じられないことでした。

finally1 つの回避策は、ブロック内のすべてを次のように置き換えることです。

JDBCUtilities.close(stmt);

のドキュメントを参照してくださいJDBCUtilities.close。ご覧のとおり、このユーティリティ メソッドを使用しても例外はスローされないため、リソース リークを心配する必要はありません。追加の利点の 1 つは、ユーティリティ メソッドがnullケースも処理するstmtため、自分でコーディングする必要がないことです。

実際には、を使用することをお勧めJDBCUtilitiesします。

于 2013-02-27T01:55:45.530 に答える
-2

Java7のtrywithresourcesまたは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();

あなたがしていることであり、あなたはこの無関係な仕事に対して実際にペナルティを支払わなければならないいくつかの状況の1つを見つけました。

さらに、あなたtry/finallyはきれいでなければなりません。 .close()投げられない、なぜ捕まえているの?

try { // don't do this
    stmt.close();
}
catch(SQLException exc) {

}

スローされないものをキャッチしていることを通知するEclipse警告を生成する必要があります。これはコンパイルエラーである可能性もありますが、確かではありませんが、Eclipse>設定>コンパイラで遊んで、どの警告がインテリジェントであるかを確認することでメリットが得られるようです。警告がわからない場合は、グーグルで検索して、役立つかどうかを確認してください。スキップしないでください。(これでやったようなものです)。

于 2013-02-27T01:23:01.947 に答える