0

プログラム内のファイルを消去する必要があります。私の解決策は、erase()そのようにする方法を用意することでした。

public static void erase(String string) {
    FileWriter fw = null;
    try {
        fw  = new FileWriter(string);
        fw.write(new String());
    } catch (IOException ie) {
        e.printStackTrace();
    } finally {
        fw.flush();
        fw.close(); 
    }
}

ここでいくつかの問題:

  • が適切に初期化されない場合fw(何らかの理由で、ファイルの欠落、無効な権限など)、ブロック内でそれを閉じようとするfinallyと、NullPointerExceptionが発生します。

  • finallyブロックがない場合は、上記の理由でNullPointerExceptionをスローしている可能性があります。

  • tryブロック内のファイルを閉じると、ファイルが正しく開かれていてもリソースがリークする可能性がありますが、正しく書き込まれません。

私が見落としている他の問題は何ですか?この方法をどのように強化できますか?

4

3 に答える 3

3

final機能をifステートメントでラップするだけです。

if(fw != null){
    fw.close(); 
}

これにより、ファイルが開かれたことがある場合は、ファイルが閉じられます。そもそも開かれていなければ、何もしません。それがあなたの望みです。

また、投稿の場合と同じかどうかはわかりませんが、一般に、catchブロックにスタックトレースを出力して続行する(例外を「飲み込む」)ことはお勧めできません。バグを隠し、追跡を非常に困難にする可能性があるため、例外をスローさせる必要があります。

編集:以下のコメントを参照してください。

于 2011-07-21T00:14:06.997 に答える
1

flush()メインブロックにを含め、キャッチにのみ入れclose()ます。次に、閉じる前にnullを確認します。

finally {
    if(fw!=null) { fw.close(); }
    }

メインブロックのフラッシュを使用して、を試行/キャッチしcloseてログに記録するか、エラーを無視することもできます。

finally {
    if(fw!=null) { 
        try { fw.close(); } catch(Throwable thr) { log.printError("Close failed: "+thr); thr.printStackTrace(); } 
        }
    }

または(一般的には推奨されません):

finally {
    try { fw.close(); } catch(Throwable thr) {;}
    }

編集

I / O、IMOを処理するための最も一般的なJavaイディオムは次のとおりです。

FileWriter fw=null;
try {
    fw=new FileWriter(string);
    fw.write(new String());
    fw.close();
    fw=null;
    }
catch(IOException ie) {
    // do something real here to handle the exception, or don't catch it at all.
    } 
finally {
    if(fw!=null) { 
        try { fw.close(); } catch(Throwable thr) { thr.printStackTrace(); } // now we're really out of options
        }
    }    

catchこれには、が単独でスローされた例外をキャッチして処理できるようにするという重要な効果がありclose()ます。(この句は、何らかの方法で例外を処理catchできる場合にのみ存在する必要があります。キャッチして無視しないでください。通常、単にキャッチしてトレースするべきではありません。)

于 2011-07-21T00:18:33.077 に答える
1

私の知る限り、これはコードを書くための正しい慣用的な方法です。

FileWriter fw = new FileWriter(string);
try {
    fw.write(new String());
    fw.flush();
} catch (IOException ie) {
    ie.printStackTrace();
} finally {
    fw.close(); 
}

説明:

  • 例外がスローされた場合new FileWriter()、何もクリーンアップする必要はありません。メソッドは、を実行せずに終了しますfinally
  • ではなく、にfw.flush()入れる必要があります。2つの理由があります。書き込みが失敗した場合は、わざわざフラッシュするべきではありません。また、を入れて例外をスローした場合、はスキップされます。tryfinallyflush()finallyclose()
于 2011-07-21T01:41:09.560 に答える