反序列化数组列表时,Java all值为null

时间:2013-12-15 04:10:27

标签: java serialization arraylist

我正在制作一个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,因为没有任何东西可以读,或者出了什么问题。

1 个答案:

答案 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(); } 子句。