2016-03-19 21 views
1

このコードは、EOFException、何を追加するか、または問題の処理方法についての提案を返します。EOFExceptionを処理する方法は?

public AbstractBlock readBlock(int blockNum, AbstractDBFile f) 
     throws IOException { 

    DBFile dbf = (DBFile) f; 
    byte[] data2 = new byte[4096]; 
    RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r"); 
    file.seek(4096+blockNum*4096); 
    Block b = new Block(); 
    for (int i = 0; i < 4096; i++){ 
     data2[i] = file.readByte(); 
    } 
    file.close(); 
    b.setData(data2); 
    return b; 

} 
+0

この質問の範囲外ですが、バイト単位でファイルを反復処理することは非常に効率的ではありません。あなたは 'byte [] buffer = new byte [4096];を使うべきです。 int count = file.read(buffer、0、buffer.length); '。 – sturcotte06

+0

例外スタックトレースを共有して、例外をどこで取得しているのかを特定できますか?それはfile.seekにありますか? – Learner

+0

あなたの質問が例外を処理する方法か、または例外が全く起こっていない理由は明らかではありません。 –

答えて

1

おそらく、このやって試すことができます。

public AbstractBlock readBlock(int blockNum, AbstractDBFile f) 
    throws IOException { 

    DBFile dbf = (DBFile) f; 
    byte[] data2 = new byte[4096]; 
    RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r"); 
    file.seek(4096+blockNum*4096); 
    Block b = new Block(); 

    for (int i = 0; i < 4096; i++){ 
     try{ 
      data2[i] = file.readByte(); 
     }catch(EOFException ex){ 
      System.out.println("End of file reached!"); 

      //break the loop 
      break; 
     } 
    } 
    file.close(); 
    b.setData(data2); 
    return b; 
} 
0

機能はreadByteIOExceptionEOFException例外

公共最後のバイトのreadByte()をはIOExceptionがスロースローすることができ

例外:

てEOFExceptionを - このファイルに達した場合終わり。

IOException - I/Oエラーが発生した場合。

あなたが本当にDATA2に割り当てる前に、何かを読めばあなたは海に例えばトライ圏でそれ​​を配置する必要があります[i]を変数

0

と言ってくださいblockNum==1 ...これは、ファイルの最初のブロックを読み取る必要があることを意味しますか?もしそうなら、あなたは0file.seek()に渡すことを期待していますが、実際には4096 + 4096 * 1 = 8192を渡しています。これは、指定されたblockNumに対して、実際にその2ブロック後に読むことを意味します。

この場合、nブロックファイルの場合、nまたはn-1をこの関数に渡すと、EOFExceptionが発生します。

最初のブロックの番号が0ではなく1である場合、1つのブロックだけがオフになりますが、根本的な問題は変わりません。

0

「私がそれをキャッチしたらどうしたらいいですか?」という意味ならば、読んだり、壊れたりしないでください。 「なぜ私はそれを得ているのですか?」という意味であれば、ブロック数について正しいと仮定すると、ブロック番号はゼロから始まるはずです。

関連する問題