2016-03-19 30 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

功能readByte可以拋出IOExceptionEOFException例外

公共最後一個字節readByte()拋出IOException異常

拋出:

EOFException - 如果此文件已經達到結束。

IOException - 如果發生I/O錯誤。

所以你必須把它放在一個try集團如海,如果你真的分配給DATA2 [I]之前讀的東西變量

0

說這個blockNum==1 ...這是否意味着你應該讀取文件中的第一個塊?如果是這樣的話,你會希望通過0file.seek(),但你實際上是通過了4096 + 4096 * 1 = 8192.這意味着對於給定的blockNum,你實際上正在讀取它之後的第二個塊。

如果是這樣,那麼對於一個n塊文件,如果您將nn-1傳遞給此函數,您將得到一個EOFException。

如果第一個塊的編號爲0而不是1,那麼你只有一個塊,但基本問題仍然是相同的。

0

如果你的意思是'我應該怎麼做,當我趕上它?',你應該停止閱讀和休息。如果你的意思是'我爲什麼要得到它',那麼你的塊編號應該從0開始,假設你對塊的數量是正確的。