0

我得到了这个例外。是因为我没有抓到他们吗?

 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

它工作正常,除了我得到上述异常,我不知道是什么原因造成的。我只是无法弄清楚我做错了什么。

4

2 回答 2

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();
}
于 2013-05-18T12:44:50.733 回答
1

最好

代替

while (true)

while (input.available() > 0)

或者,在IMMEDIATELY BEFORE 之前 添加:catch (IOException e)readRecord

} catch (EOFException e) {
  // EOF reached
}
于 2013-05-18T13:11:26.623 回答