我正在制作一个java程序作为对自己学习的挑战,而且我目前在序列化和反序列化arraylist时遇到了麻烦。当我反序列化时,所有值都为null。
这是最初序列化列表的函数:
private void saveModList(ArrayList<Moderator> m) {
try {
ObjectOutputStream fOut = new ObjectOutputStream(new FileOutputStream("data/modlist.ctm"));
fOut.writeObject(m);
fOut.close();
} catch(IOException ex) {
JOptionPane.showMessageDialog(null, "Could not save moderator list.",
"Save error", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
}
这是反序列化列表的函数:
public static ArrayList<Moderator> openModList() {
try {
ObjectInputStream fIn = new ObjectInputStream(new FileInputStream("data/modlist.ctm"));
try {
return (ArrayList<Moderator>) fIn.readObject();
} catch (ClassNotFoundException ex) {
JOptionPane.showMessageDialog(null, "Could not open moderator list",
"Read error", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
fIn.close();
} catch(FileNotFoundException ex) {
JOptionPane.showMessageDialog(null, "Could not load moderator data. File not found.",
"Moderator file not found.", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
} catch(EOFException ex) {
} catch(IOException ex) {
JOptionPane.showMessageDialog(null, "Could not load moderator data.",
"Error", JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
}
//If something screws up, return null, and the user will not be logged in
return null;
}
这会调用函数反序列化
ArrayList<Moderator> modLoginList = new ArrayList<Moderator>();
modLoginList = Main.openModList();
//Check all of the moderators.
//If one of them matches up to a moderator username and password, log them in
for(int i = 0; i < modLoginList.size(); i++) {
if(modLoginList.get(i).name.equals(username) && modLoginList.get(i).password.equals(password)) {
loggedIn = true;
break;
}
}
当我这样做时,我也会在if语句中获得NullPointerException,检查主持人的凭据是否有效。当我去尝试直接打印出值时,它们就是空的。主持人类确实实现了serializable并具有串行版本ID。对于为什么会发生这种情况以及如何解决它/更好的方法来做任何建议都非常感谢。
此外,它不仅仅是直接返回null,因为没有任何东西可以读,或者出了什么问题。
答案 0 :(得分:1)
NullPointerException似乎来自返回openModList
的{{1}}方法。一种选择是使用空检查包围for循环:
null
您要序列化的对象引用可能是if (modLoginList != null) {
for(int i = 0; i < modLoginList.size(); i++) {
if(modLoginList.get(i).name.equals(username) && modLoginList.get(i).password.equals(password)) {
loggedIn = true;
break;
}
}
}
。因此,在传递对象之前,请检查代码中将对象添加到ArrayList的部分。
也就是说,您的代码可以使用其他更改,例如代替此块:
null
添加一个finally子句:
try {
return (ArrayList<Moderator>) fIn.readObject();
} catch (ClassNotFoundException ex) {
...
ex.printStackTrace();
}
fIn.close();
无论try / catch子句发生什么,都将执行try {
return (ArrayList<Moderator>) fIn.readObject();
} catch (ClassNotFoundException ex) {
...
ex.printStackTrace();
} finally {
fIn.close();
}
子句。