-4

このコードから例外ハンドラを削除したいのは、例外ハンドラが存在する理由がわからないためです。コードの段階では何​​もしないと思います。私はこれを持っています:

public void ToFile(){
               try{
                   PrintWriter pw = new PrintWriter(new FileWriter(file, false));

                    for (String st:stringarray){ 
                          pw.println(st);
                          pw.close();
                            }
                    }catch(Exception exception)
                    {}
            }

例外部分を削除すると、これに変換されますが、エラーが発生します...:

public void ToFile(){

                            PrintWriter pw = new PrintWriter();
                            for (String st:items){ 
                                    pw.println(srtingarray);
                                    pw.close();
                            }

            }

私は何をすべきか ? 編集エラー: PrintWriter に適したコンストラクターが見つかりません。

4

3 に答える 3

3

次のようなことを試してください:

public void toFile() throws IOException {
    PrintWriter pw = new PrintWriter(new FileWriter(file, false));

    for (String str: items){ 
        pw.println(str);
    }

    pw.close();
}

a を使用すると、書き込みに失敗したときに sPrintWriterを生成できます。IOException関数でそれらをキャッチして処理するかthrows、例外が呼び出し元に上向きに伝播できるようにする句を追加できます。

(また、close()呼び出しをループの外に移動し、使用方法を修正しましたpw。)

呼び出し元が例外を処理する必要があるため、句を追加してthrowsも問題は正確に解決されないことに注意してください。問題を 1 つ上のレベルに移動するだけです。しかし、それは正しいことです。を完全に無視する方法はありませんIOException。これらの関数はエラーになる可能性があり、Java は何らかの時点でこれらのエラーを処理することを強制します。これは良いことです

ここで例外を処理したい場合は、それを行うことができます。そして、節で何かをするのは良い考えです。空のハンドラーをcatch見ると、赤ちゃんのクヌースは悲しくなります。catch(Exception e) { }

public void toFile() {
    try {
        PrintWriter pw = new PrintWriter(new FileWriter(file, false));

        for (String str: items){ 
            pw.println(str);
        }

        pw.close();
    }
    catch (IOException exception) {
        exception.printStackTrace();
    }
}
于 2012-10-25T03:09:10.570 に答える
3

例外ハンドラーは、ファイルを開くことができなかったときにスローされる可能性のある IOException を「処理」していました。new FileWriter(file, false)それを処理しない場合は、メソッド シグネチャで宣言する必要があります。

public void toFile() throws IOException {
    PrintWriter pw = new PrintWriter(new FileWriter(file, false));
    for (String st : items) { 
        pw.println(st);
    }
    pw.close();
}

また、この機会にメソッド名を修正しました。メソッド名を大文字で始めないでください。重大なスタイル エラーです。

そして、さらに 2 つのコンパイル エラーとバグを修正しました。(それを見つけられるかどうかを確認してください...そして、なぜそれがバグだったのかを突き止めてください。)

最後に、これを書く本当に正しい方法は次のとおりです。

// Java 7
public void toFile() throws IOException {
    try (PrintWriter pw = new PrintWriter(new FileWriter(file, false))) {
        for (String st : items) { 
            pw.println(st);
        }
    }
}

また

// pre-Java 7
public void toFile() throws IOException {
    PrintWriter pw = new PrintWriter(new FileWriter(file, false))) {
    try {
        for (String st : items) { 
            pw.println(st);
        }
    } finally {
        pw.close();
    }
}

FileWriter予期しない例外がループでスローされた場合でも、常に閉じられるようにこれを行う必要があります。


1 - 実際、オリジナルcatch (Exception exception) { }は本当にひどいものでした。まず、何も言わずに例外を飲み込んでいた。第二に、それは...のためにそれを行っていました。これには、バグの証拠である可能性が最も高いExceptionような例外が多数含まれています。NullPointerException例外をつぶさないでください。特に、Exceptionそのように「処理」しようとしないでください。

于 2012-10-25T03:09:18.380 に答える
0

例外の理由は、ループの最初の繰り返しの後、PrintWriter オブジェクトを閉じているためです。

于 2012-10-25T03:06:46.567 に答える