我一直在用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);
}
}
为什么会抛出此异常,我该如何解决?感谢。
答案 0 :(得分:3)
是的,这表现为documented:
创建一个从指定的InputStream读取的ObjectInputStream。从流中读取序列化流头并进行验证。
...
抛出:
IOException - 如果在读取流标题时发生I / O错误
如果您的文件为空,则它不包含流标头。使用在写入0个对象后关闭的ObjectOutputStream
创建的文件与空文件不同。
答案 1 :(得分:2)
我发现这是使用Eclipse逐行调试器的行。
堆栈跟踪也会显示该行。
初始化的ObjectInputStream会导致EOFException
当实际文件格式无效时(或者你没有按预期阅读),OIS有一种抛出EOF的奇怪习惯。鉴于文件名是todo.txt
我怀疑它是文本文件,不能被读作对象流。
另一种可能性是你比这更进一步,当你检查每一个第二个对象是null
时,你的循环就会破裂。这有点像逐行读取文本文件但BufferedReader错误,而ObjectInputStream完全错误。
如果要将List序列化为对象流,我建议您编写并读取List,而不是一次读取一个元素而不知道何时完成。