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

Можете ли вы поделиться своим стеклом stacktrace, чтобы найти, где вы получаете исключение? Это в файле.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 может бросить IOException и EOFException исключения

общественности последний байт ReadByte() бросает IOException

Броски:

EOFException - если этот файл достиг конец.

IOException - если произошла ошибка ввода-вывода.

так что вы должны положить его в попытку блока, например, на море, если вы действительно читать что-то перед назначением на data2 [I] переменная

0

Скажите, что blockNum==1 ... означает ли это, что вы должны прочитать первый блок в файле? Если это так, вы должны были бы пройти 0 до file.seek(), но вы на самом деле проходите 4096 + 4096 * 1 = 8192. Это означает, что для данного блокаNum вы фактически читаете второй блок мимо него.

Если это так, то для файла n-блока, если вы передадите n или n-1 этой функции, вы получите EOFException.

Если первый блок пронумерован 0, а не 1, то вы отключены только одним блоком, но основная проблема остается неизменной.

0

Если вы имеете в виду «что мне делать, когда я его поймаю?», Вы должны прекратить чтение и перерыв. Если вы имеете в виду «почему я его получаю?», Нумерация блоков должна начинаться с нуля, если вы считаете, что вы правильно указали количество блоков.

Смежные вопросы