2

数日前、入力が完了するまでファイルから読み取ることについて質問しました。調査したいくつかの回答を受け取りましたが、このトピックに何らかの形で関連する質問が1つあります。それは、次の代わりに、追加のテスト、「finally」句、および別のtry-catchを使用する必要がある理由です。

DataInputStream reading = null;
try{
        reading = new DataInputStream(new FileInputStream("tes.t"));
        while(true)
        {
            System.out.println(reading.readInt());
            System.out.println(reading.readDouble());
        }
        }catch(IOException xxx){System.err.println("Error: " + reading.getMessage());}
         catch(EOFException xxx){reading.close();}

なぜこれでは不十分なのですか?つまり、EOFに到達するとすぐに、例外が発生します。それ以外の場合は、例外をキャッチしてエラーメッセージを出力します。なぜ追加のテストが必要なのですか?このアプローチの何が問題になっていますか?

編集:わかりました、なぜそれが悪いことなのか理解できました。しかし、次のようなコードを作成した場合はどうでしょうか。

DataInputStream reading = null;
try{
        reading = new DataInputStream(new FileInputStream("tes.t"));
        while(reading.available()!=0)
        {
            System.out.println(reading.readInt());
            System.out.println(reading.readDouble());
        }
        }catch(EOFException xxx){}
         catch(IOException xxx){System.err.println("Error: " + reading.getMessage());}

reading.available()の値をチェックすることは、入力側のより良いテストですか、それとも同じくらい悪いですか?

4

2 に答える 2

3

例外を除いて実行フローを制御するのはエレガントではありません。EOFはファイルの読み取り中の通常の状況であるため、他の方法で処理する必要があります。

よりエレガントなコードは次のようになります。

byte[] buf = new byte[8192];
int nread;
while ((nread = is.read(buf)) >= 0) {
  // process the first `nread` bytes of `buf`
}

ソース:JavaのDataInputStreamから読み取る不明なバッファサイズ

ここに、例外を使用してフローを制御するべきではない理由についての非常に優れた説明があります。例外を通常の制御フローとして使用しないのはなぜですか。

于 2012-11-09T19:19:36.190 に答える
0

リソースを閉じるにはfinally句が必要です。ヒットしない可能性がEOFあり、最終的にブロックを実行する必要があります。さらに、上記のコードはひどいものであり、特にファイルが終了したときの状態がわかっているため、本番システムでは使用しないでください。理想的には、これをレビューした他の人々が同じ発言をしました。例外を「通常の」プログラム実行フローとして扱うことは、ソフトウェアエンジニアリングの問題に対する最も好ましくないアプローチです。

于 2012-11-09T19:20:41.757 に答える