2016-10-22 80 views
1

我現在對存儲系統有了更深入的瞭解,但我無法使其正常工作。數據似乎被保存,保存的數據絕對不是空的,我仍然得到一個java.lang.NullPointerException。從存儲中讀取時遇到問題

所以這裏是我的課,我想保存並稍後讀取到存儲。

樂隊是一個平凡的類與名稱和流派字符串。

public class Band implements Externalizable{ 
    String name; 
    String genre; 

    public Band(String bnd, String gen){ 
     this.name = bnd; 
     this.genre = gen; 
    } 
    public Band() { 

    } 

    public String getName(){ 
     return this.name; 
    } 
    public String getGenre() { return this.genre; } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public void setGenre(String genre) { 
     this.genre = genre; 
    } 

    @Override 
    public String toString(){ 
     String s; 
     s = this.name; 
     return s; 
    } 
    public int getVersion(){ 
     return 1; 
    } 

    @Override 
    public void externalize(DataOutputStream out) throws IOException { 
     Util.writeUTF(name, out); 
     Util.writeUTF(genre, out); 
    } 

    @Override 
    public void internalize(int version, DataInputStream in) throws IOException { 
     name = Util.readUTF(in); 
     genre = Util.readUTF(in); 
    } 

    public String getObjectId(){ 
     return "Band"; 
    } 

} 

BandList只是一個BandList被添加到ArrayList的類。

public class BandList implements Externalizable{ 
    List <Band> bandList; 

    public List getBandList(){ 
     return this.bandList; 
    } 

    public BandList(){ 
     bandList = new ArrayList<Band>(); 
    } 

    public void setBandList(List<Band> bandList) { 
     this.bandList = bandList; 
    } 

    public int getVersion(){ 
     return 1; 
    } 

    @Override 
    public void externalize(DataOutputStream out) throws IOException { 
     Util.writeObject(bandList, out); 
    } 

    @Override 
    public void internalize(int version, DataInputStream in) throws IOException { 
     bandList = (ArrayList<Band>) Util.readObject(in); 
    } 

    public String getObjectId(){ 
     return "BandList"; 
    } 
} 

所以,在其它的類,其中填充在一些TextFields的用戶,所述帶被添加到BandList,因此我請saveListsToStorage();

public void saveListsToStorage(){ 
     Storage.getInstance().clearStorage(); 
     Storage.getInstance().writeObject("Bands", bandList); 
    } 

所以現在,在開始應用時,應用程序是在Storage尋找數據,如果找到了,它會返回存儲的BandList對象,否則它會返回一個新的BandList對象。

在此之前,我記數的類與

Util.register("Band", Band.class); 
    Util.register("BandList", BandList.class); 

最後調用主這種方法開頭:

public BandList loadSavedBandList() { 
     String[] temp = Storage.getInstance().listEntries(); 
     for (String s : temp) { 
      if (s.equals("Bands") == true) { 
       BandList tempBand = (BandList) Storage.getInstance().readObject("Bands"); 
       return tempBand; 
      } 
     } 
     return new BandList(); 
    } 

保存後,然後加載它拋出空指針異常,我不知道爲什麼。正如Shai告訴我的,我現在使用ArrayList而不是LinkedList,並按照指南中的說明實施了Externalizable接口。

也許你們中的一些人可以告訴我這裏有什麼問題。

編輯:

這裏是例外:

java.lang.NullPointerException 
    at com.rosscode.gehma.Menu_Form.updateBandContainer(Menu_Form.java:95) 
    at com.rosscode.gehma.Menu_Form.<init>(Menu_Form.java:73) 
    at com.rosscode.gehma.main.start(main.java:61) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.codename1.impl.javase.Executor$1$1.run(Executor.java:106) 
    at com.codename1.ui.Display.processSerialCalls(Display.java:1152) 
    at com.codename1.ui.Display.mainEDTLoop(Display.java:969) 
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) 

編輯2,95號線:

if(bandList.getBandList().isEmpty() == false) { 
      for (int i = 0; i < bandList.getBandList().size(); i++) { 
       Button temp = new Button(bandList.getBandList().get(i).toString()); 
       temp.addActionListener((e) -> 
         nextStep() 
       ); 
       listCont.add(temp); 
      } 
      menuForm.revalidate(); 
     } 
+0

你從控制檯中包括除了NullPointerExcepiton堆棧之外的所有東西。你能否編輯你的文章並加入,然後在這裏發表評論,我會看到你做出了改變? –

+0

嗨,我添加了異常堆棧。在updateBandContainer()方法中,它通過迭代Band列表來更新BandsContainer,並將每個Band添加爲按鈕。 –

+0

那麼代碼和特定行95是什麼? –

回答

1

NullPointerException異常是相當了不起的事情,因爲他們不僅是很容易弄清楚,他們甚至向你展示他們發生的確切路線。你所要做的就是查看.的剩餘部分,並檢查它是否爲空。只要你找到它,你會發現問題。

所以我們來看看你的代碼。可悲的是,我不知道哪條線是95線,但我猜這是以if開頭的線。

這表示要麼是bandList爲空,要麼返回null。快速查看getBandList()可以看出,它不會爲空,因爲您在BandList類的構造函數中初始化列表。其中只留下bandList

可悲的是你沒有張貼在那裏你得到了從,但我會假設你只是不喜歡的東西:

BandList bandList = loadSavedBandList(); 

讓我們看看這種方法。(順便說一句:如果你在這個答案的末尾沒有這樣做,我會多說一些你必須看的地方)。

如果找不到密鑰,它將返回一個新的BandList,它不能爲空。所以它必須找到一些東西,這意味着關鍵的存在,但價值爲零。

讓我們再走一步,看看你如何把事情放在首位。

public void saveListsToStorage(){ 
    Storage.getInstance().clearStorage(); 
    Storage.getInstance().writeObject("Bands", bandList); 
} 

現在「在其他一些班級」並沒有真正解釋太多。但是既然你讀了一個null,這意味着你在這裏寫一個null。這意味着在這個「其他職業」中,至少在這種方法中,bandList = null

隨着你給出的代碼,我不可能深入研究這個問題,但它看起來像在「另一個類」中,你得到了一個名爲bandList的類屬性,但是沒有在其中放入任何東西。


或者你保存的一切權利,但沒有叫

BandList bandList = loadSavedBandList(); 
以某種形式

或其他您if之前,這也將非常說明問題。我的意思是...如果你永遠不加載bandList,它顯然將爲空......