6

(Windows 7、Eclipse Juno 4.2.1、および Java 7 SE を使用して) いくつかのテストを行ったところ、メソッドが catch ブロックで明示的に返されず、オブジェクトが try/catch の外で宣言されている場合、「リソース漏れ」の警告が発せられました。

「リソースリーク」を生成しません:

    public void extISImReturnNoWarning() {
    InputStream is = null;
    try {
        is = new FileInputStream("A");
        is.available();
    } catch (IOException e) {
    }
}

コードを少し変更すると、「リソース リーク」が発生します。

public void locISImReturnHasWarning() {
    try {
        InputStream is = new FileInputStream("A");
        is.available();
    } catch (IOException e) {
    }
}

public void extISExReturnHasWarning() {
    InputStream is = null;
    try {
        is = new FileInputStream("A");
        is.available();
    } catch (IOException e) {
        return;
    }
}

すべてのメソッドは機能的に同じように見えます。これがバグである場合、これは Eclipse または Java の問題ですか?

4

1 に答える 1

2

いくつかの調査の結果、これは Eclipse のバグであるという結論に達しました。Eclipse ダウンロード サイト (Kepler M3) で見つけた最新のビルドでテストしましたが、問題は解決しません。また、過去 30 日間に Eclipse プロジェクトで報告された同様の問題に関する 5 ~ 6 件のバグ レポートも見つけました。調査中に、別の奇妙な動作も発見しました。

    public void makeConnection() throws SQLException {
    Connection connection = null;
    try {
        connection = DriverManager.getConnection("localhost");
        for (int i = 0; i < 1; i++)
            if (i < 1)
                throw new SQLException("Foo");
        connection.commit();
    } finally {
        close(connection);
    }
}

public void close(Connection c) {
}

このコードは、リソース リークの警告を生成します。ただし、これらのいずれかを削除することにより、

  • 閉じる呼び出し (接続)
  • forループ

..リソース リークの警告が表示されなくなります。奇妙なことに、単純に接続を作成し、それを閉じないバニラのケースでは、リソース リークは報告されません。

全体として、Eclipse Juno でのリソース リークの検出は、当面は少しバグが発生しやすいと思います。おそらく、今のところ Eclipse でのリソース リークを無視して、Kepler を待つのが最善の方法でしょう。

2014年12月の更新:現在Eclipse Lunaを実行していますが、問題は解決しません...

于 2012-12-04T20:29:37.563 に答える