2011-03-07 20 views
6

次のコードは、EOFExceptionを生成します。何故ですか?readObjectを使用したJava不思議なEOF例外

public static Info readInfoDataFromFile(Context context) { 
    Info InfoData = null; 
    FileInputStream fis = null; 
    ObjectInputStream ois = null; 
    Object object = null; 

    if (context.getFileStreamPath("InfoFile.dat").exists()) { 
     try { 
      fis = context.openFileInput("InfoFile.dat"); 
      ois = new ObjectInputStream(fis); 
      Object temp; 
      try { 
       // here it throws EOF exception in while loop 
       while ((temp = ois.readObject()) != null) { 
        object = temp; 
       } 
      } catch (NullPointerException npe) { 
       npe.printStackTrace(); 
      } catch (EOFException eof) { 
       eof.printStackTrace(); 
      } catch (FileNotFoundException fnfe) { 
       fnfe.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (ois != null) { 
        ois.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       if (fis != null) { 
        fis.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

のStackTrace:

03-07 14:29:01.996: WARN/System.err(13984): java.io.EOFException 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.DataInputStream.readByte(DataInputStream.java:131) 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:628) 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:907) 
03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)03-07 14:29:01.996: WARN/System.err(13984):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217) 
03-07 14:29:01.996: WARN/System.err(13984):  at 
+2

のJavadoc: '対応するwriteObjectメソッドによって書かれたカスタムデータの境界を越えてオブジェクトデータを読み込むしようとするが、OptionalDataExceptionがtrue'を – malinois

+0

のEOFフィールドの値でスローされますええ、私はすでにそれを読んだことがありますそれを避ける方法は? –

答えて

9

あなたのファイルが含まれているどのように多くのオブジェクトに依存します。オブジェクトが1つしかない場合は、1ステップで逆シリアル化できます。

try { 
    Object temp = ois.readObject(); 
} 
catch(Exception e) { 
    //handle it 
} 
+2

ええ、それはエラーEOFをスローします..なぜですか? –

+0

親切にスタックトレースを参照してください。 –

+6

@Aizaz:なぜファイルの最後に 'readObject()'が 'null'を返すと思いますか?そうではありません。常にオブジェクトを返すか、例外をスローします。したがって、あなたが明示的に 'null'をシリアル化していない限り、' readObject() 'が' null'を返すとは思わないはずです。 –

2

ObjectInputStreamreadObject()の定義は、ストリームの終わりに達したとき、それはnullを返すことを指定していません。代わりに、ファイルの最後を超えて追加のオブジェクトを読み込もうとすると、例外がスローされます。

+0

次にファイルの最後に検出する方法は?私はEOF例外を避ける方法を意味する? –

+0

期待するオブジェクトの数を示すファイルに情報を格納するか、EOF例外を適切に処理します。例外は必ずしも「失敗」であるとは限りませんが、スタックを介して状態の変化を伝播させる方法として使用できます。 – AndyT

+0

@Aizaz:*キャッチ* it! – EJP

4

それを作成するときにストリームにnullを書いた場合はまず、readObject()nullを返します。ストリームにデータがなくなると、EOFExceptionがスローされます。

EOFが予想されない場合は、ストリームが破損している可能性があります。これは、データを書き込んだ後で閉じることを忘れた場合に発生します。

+0

その後、ファイルの最後にどのように検出するのですか?私はEOF例外を避ける方法を意味する? –

+4

@Aizaz:EOFExceptionはそれを示しています。チェックされた例外は、制御フローのために捕捉され、検査されることを意味する。エラーではなく、追加のリターンコードです。時々。正しく使用されている場合。ほとんどのIOExceptionsではそうではありません。しかし、EOFExceptionを修正してください。 ...エヘム。別の解決策は、オブジェクトの数をストリームの前にオブジェクトの前に書き込むことで、既知の回数ループすることができます。またはオブジェクトをリストや配列のようなコンテナに入れて、代わりにコンテナをロードします。 –

+0

これは正しい答えだと思います:@Aizaz - readObject()は、ファイル全体を一度に読み込み、逆シリアル化します。ループではなく、一度だけ呼び出すようにしてください。 - adarshr 18時間前 –

5

私は同じ神秘的なEOFExceptionを持っていて、ObjectOutputStreamを介してObjectInputStreamに送信するオブジェクトクラスのパスのみでした。それらは同じパス(同じパッケージ名と同じクラス名)を持たなければなりません。

関連する問題