我得到了这个例外。是因为我没有抓住它们吗?
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2577)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at ReadStudentRecord.readRecord(ReadStudentRecord.java:34)
at ReadStudentRecordTest.main(ReadStudentRecordTest.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
这是我的类,它读取二进制文件:
import java.io.*;
public class ReadStudentRecord {
private ObjectInputStream input;
public void openFile() {
try {
input = new ObjectInputStream(new FileInputStream("student.dat"));
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
} // end of open file method
public void readRecord() {
Q4 student;
System.out.println("Student Name\t\t Student average Mark");
try {
while (true) {
student = (Q4) input.readObject();
System.out.println(student.getStudentName() + "\t\t\t" + student.averageMark(student.getMark()));
}
} catch (ClassNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}// end of readRecord method
public void closeFile() {
try // close file and exit
{
if (input != null)
input.close();
System.exit(0);
} // end try
catch (IOException ioException) {
System.err.println("Error closing file.");
System.exit(1);
} // end catch
} // end method closeFile
} // end of class
它工作正常,除了我得到上述异常,我不知道是什么原因导致它。 我无法弄清楚我做错了什么。
答案 0 :(得分:3)
您正在无限循环中从文件中读取对象。
while (true) {
student = (Q4) input.readObject();
...
}
最后,流到达文件的末尾,但您仍然需要更多对象,这就是抛出异常的原因。
一种可能的解决方案是捕获EOFException,这意味着不再存在对象。
try {
while (true) {
student = (Q4) input.readObject();
...
}
}
catch (EOFException eof) {
// Reached end of file. Do anything here, if you want.
// Or else, just ignore the end of file, and proceed out of the block.
}
finally {
// Some other stuff.
// Do not forget to close the stream.
input.close();
}
答案 1 :(得分:1)
<强>优选地强>
替换
while (true)
与
while (input.available() > 0)
另外,在catch (IOException e)
中 {{>} readRecord
之前立即添加:
} catch (EOFException e) {
// EOF reached
}