3

Eclipse(Juno) は、このサンプルにリソース リークの警告があると言っています。これは有効ですか?
これは、例外のスロー ポイントがforループ内にある場合に発生します。

package kuni;

import java.io.FileWriter;
import java.util.Arrays;

public class ResourceWarn {
    public static void main(String[] args){

        try {
            FileWriter f = null;
            try{
                f = new FileWriter("test.txt");
                for(String s : Arrays.asList("a","b","c")){
                    if(s.equals("c"))throw new RuntimeException("aa"); //resource leak warn here
                    f.write(s);
                }
            }finally{
                try{
                    f.close();
                }catch(Exception ignore){
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

3 に答える 3

2

Eclipse が不満を言っていることはわかっていると思います。

        } finally {
            try {
                System.err.println("closing f");
                f.close();
            } catch(Exception ignore) {
            }
        }

問題は、println!!!

System.err.println(...)Eclipse は、呼び出しが例外をスローする可能性があると考えています。それが発生した場合、f.close()呼び出しは発生しません....つまり、リークです。

あなたも私も、これが「あり得ない」ことはわかっていますが、Eclipse コード アナライザーは、おそらく の特殊な性質を理解していませんSystem.err

さらに、コードのどこかで、失敗の原因となるようなことを行っている可能性があります。たとえば、通常のインスタンスを、毎月第 2 火曜日に未チェックの例外をスローするカスタム サブクラスのインスタンスに置き換えるためにSystem.err.println(...)使用した可能性があります。System.setErr(...)System.errPrintWriter

を削除するか、通話println後に移動してみてください。close

于 2013-02-15T03:12:39.663 に答える
1

新しいを投げると、あなたはあなたのを閉じる機会がなくてRuntimeExceptionもすぐにブロックに導かれます。aがスローされた場合は、を閉じる必要があります。catchFileWriterFileWriterRuntimeException

public static void main(String[] arg) {
    FileWriter f = null;
    try {
        f = new FileWriter("test.txt");
        for (String s : Arrays.asList("a", "b", "c")) {
            if (s.equals("c"))
                throw new RuntimeException("aa"); // resource leak warn here
            f.write(s);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (f != null) {
                f.close();
            }
        } catch (Exception ignore) {
        }
    }
}
于 2013-02-15T02:40:41.490 に答える
1

いいえ、リソースリークはありません。日食が何を訴えているのかわかりません。

あなたのコードに関して私が持っている唯一のコメントは次のとおりです。

  1. キーワードと中括弧の前後にスペースを入れると読みやすくなります。

  2. finallyブロックでIOExceptionを破棄するのではなく、ログに記録して続行する必要があります(現在のように)。クリーンアップコードが例外をスローするときに発生する奇妙なバグがあり、忠実にログを記録することで、非常に面倒なデバッグセッションを節約できます。

  3. このようなデモの場合、スタックトレースの出力は問題ありませんが、通常はログに記録し、短いエラーメッセージのみをstderrに出力する必要があります。良性の場合でも、スタックトレースを表示すると、ユーザーはパニックに陥ります。

それ以外は、コードは私には良さそうです、そして上記のどれもリソースリークを示唆していません。

于 2013-02-15T02:38:52.103 に答える