Как справиться с 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;
}
4 ответа
Возможно, вы можете попробовать сделать это:
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;
}
Если вы имеете в виду "что мне делать, когда я поймаю это?", Вам следует перестать читать и ломать голову. Если вы имеете в виду "почему я это получаю?", Нумерация блоков должна начинаться с нуля, если вы правильно указали количество блоков.
Функция readByte
может бросить IOException
а также EOFException
исключения
открытый финальный байт readByte() выбрасывает IOException
Броски:
EOFException - если этот файл достиг конца.
IOException - если ошибка ввода-вывода происходит.
поэтому вы должны поместить его в блок try, например, в море, если вы действительно что-то прочитали, прежде чем присваивать переменной data2[i]
Скажи это blockNum==1
... означает ли это, что вы должны читать самый первый блок в файле? Если это так, вы ожидаете пройти 0
в file.seek()
, но вы фактически передаете 4096+4096*1 = 8192. Это означает, что для данного blockNum вы фактически читаете 2-й блок после него.
Если так, то для n-блочного файла, если вы передадите n
или же n-1
к этой функции вы получите исключение EOFException.
Если первый блок пронумерован 0, а не 1, то у вас только один блок, но основная проблема остается той же.