4

私は基本的にここで述べたのと同様の問題を抱えています:objectinputstreamを読み取るときのJavaでのEOFexceptionですが、クリーンなコードで答えが見つかりません。

答えはObjectInputStream#readObject、リーダーがファイルの終わりに到達したときに例外をスローすることを示しています。Webで解決策を探しましたが、解決策が見つかりませんでした。この場合の良い、きれいな解決策でしょうか?

注:私はこれを試しました(しかし、見た目は醜く、クリーンなコードではありません)。私はより良い解決策を探しています:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
try {
    Object o;
    while ((o = ois.readObject()) != null) {
        if (o instanceof MyClass) {
            MyClass m = (MyClass)o;
            //use the object...
        }
    }
} catch (EOFException eofex) {
    //do nothing
}  catch (IOException ioex) {
    throw ioex;
    //I have another try/catch block outside to control the life of the ObjectInputStream
}
//later in the code...
ois.close();
4

5 に答える 5

13

それが起こるはずです。あなたのコードは間違っています。Javadocを確認してください。を書き込んだ場合にreadObject()のみ返されます。EOFでnullを返すことについては何も述べていません。リターンまでのループは、 viaを作成した場合にのみ停止し、作成しなかった場合は。を取得します。nullnullreadObject()nullnullwriteObject()EOFException

于 2012-10-02T03:27:34.363 に答える
12

@EJPの答えはそれを釘付けにしました。

ただし、「例外は通常のフロー制御には使用しないでください」クラブの有料メンバーである場合*、他の手段を使用していつ停止するかを決定できる場合は、例外をキャッチする必要はありません。例えば

  • intまたはIntegerオブジェクトとして送信されたカウントでストリームを開始できます。
  • を送信することで、ストリームの終わりをマークできますnull
  • 「これで終わりです」という意味の特別なオブジェクトを送信することで、ストリームの終わりをマークできます。MyClassインスタンスである必要はありません。
  • ...を送信することもできますがList<MyClass>、それはオブジェクトを「ストリーミング」できないことを意味します。

これは、送信者側のコードを変更できることを意味することに注意してください...


*このクラブの会員になるには、循環論法を吸収する能力、または教義を真実として盲目的に受け入れる意欲のいずれかが必要です。:-)


議論を繰り返すのではなく、「通常のフロー制御」の議論に関連する私の答えのいくつかへのリンクを次に示します

それらを読んでみると、私が柵の両側にしっかりと降りていないことがわかります。むしろ、私の見解では、トレードオフを理解し、ケースバイケースで例外が適切かどうかを判断する必要があります。

于 2012-10-02T03:50:33.873 に答える
4

あなたはこれを試すことができます:

boolean check=true;
while (check) {
   try{
       System.out.println(ois.readObject());
   } catch(EOFException ex){
       check=false;
   }
}
于 2015-01-22T04:23:54.990 に答える
1

データを書き込んだコードでObjectOutputStreamを閉じるのを忘れたため、このエラーが発生しました。出力ストリームを閉じるコードを使用してデータを再度書き込むと、データを正常に読み取ることができました。

于 2020-02-14T22:32:36.813 に答える
-1

readObject()ファイルの終わりに達したときに返されませんがNULL、ファイルを最初から制御する場合はNULL、出力ストリームを閉じる直前にいつでも追加できます。オブジェクトとして渡されますが、ファイルの終わりを次のようにテストできます。

Boolean complete = false;
ObjectInputStream in = <...>

while(complete != true) {
    Object test = (Object)in.readObject();
    if(test != null) { someArrayList.add(test); }
        else { complete = true; }
}
于 2015-05-29T09:46:38.483 に答える