2013-12-15 69 views
0

我正在製作一個java程序作爲對自己學習的挑戰,而我目前在序列化和反序列化ArrayList時遇到了麻煩。當我反序列化所有的值爲空。反序列化數組列表時,Java所有值都爲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,檢查是否th主持人的憑證是有效的。當我去嘗試打印出值時,它們是空的。主持人類確實實現了可序列化並具有序列版本ID。任何建議,爲什麼發生這種情況,以及如何解決它/更好的方式來做到這一點非常感謝。

此外,它不僅僅是完全返回null,因爲沒有什麼可讀的,或出了什麼問題。

+2

你在哪裏/如何調用'saveModList(...)'以及你傳遞給它的內容?我強烈懷疑它實際上是保存了一個空值列表。 –

+0

爲什麼要創建'new ArrayList',然後立即替換它? – chrylis

+0

你可以發佈調用'saveModList()'的代碼嗎? – initramfs

回答

1

NullPointerException似乎來自openModList方法返回null。一種選擇是圍繞你的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; 
     } 
    } 
} 


這有可能是你的序列化對象引用是null。因此,在將它傳遞給序列化之前,請檢查將對象添加到ArrayList的代碼部分。


這就是說,你的代碼可以使用其他變化,如不是此塊:

try { 
    return (ArrayList<Moderator>) fIn.readObject(); 
} catch (ClassNotFoundException ex) { 
    ... 
    ex.printStackTrace(); 
} 

fIn.close(); 

添加一個finally從句:

try { 
    return (ArrayList<Moderator>) fIn.readObject(); 
} catch (ClassNotFoundException ex) { 
    ... 
    ex.printStackTrace(); 
} finally { 
    fIn.close(); 
} 

finally子句將忽略執行try/catch子句發生了什麼。