【发布时间】:2013-10-27 20:44:28
【问题描述】:
我一直在用 Java 编写一个待办事项列表应用程序,每个待办事项都存储为 ToDo 类(我创建的)的一个对象。
ToDo 类是可序列化的,我正在使用 ObjectOutputStream 将对象写入文本文件。这样做后我关闭了 ObjectOutputStream。
我应该提一下,目前我的文本文件是空的,因为其中没有待办事项,而且 GUI.items 是我的 GUI 类中的静态 ArrayList。
当我运行读取文件的方法时,会在行上抛出一个 IO 异常:
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
这是读取文件的方法:
public void read() {
try (FileInputStream fileInputStream = new FileInputStream("todo.txt")) {
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
GUI.items.clear();
while (objectInputStream.readObject() != null) {
GUI.items.add((ToDo) objectInputStream.readObject());
}
GUI.updateInterface();
objectInputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
//JOptionPane.showMessageDialog(null, "Error: To-Do List not found.\nPlease contact the developer.", "Error", JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Error: To-Do List could not be opened.\nPlease contact the developer.", "Error", JOptionPane.ERROR_MESSAGE);
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Error: To-Do List object type could not be found.\nPlease contact the developer.", "Error", JOptionPane.ERROR_MESSAGE);
}
}
为什么会抛出这个异常,我该如何解决?谢谢。
【问题讨论】:
-
你为什么要扔掉第二个对象?
-
我不知道我是怎么做到的?这可能是原因吗?谢谢:)
-
@samdy1: 这不是原因,而是你调用
readObject()作为while 循环的条件,然后再次调用readObjectinside while 循环。 -
@JonSkeet 如果抛出异常的行不是 OP 认为的行,这可能是原因。
-
@PeterLawrey:好吧,如果堆栈跟踪错误并且如果文件实际上不是如所声称的那样为空。但是,如果我们要怀疑这个问题的所有内容,我们不妨怀疑代码是这样的;)
标签: java ioexception objectinputstream eofexception