2016-10-22 8 views
1

Iveはストレージシステムをより深く見ていましたが、正しく動作させることができませんでした。データが保存されているようですが、保存されたデータは間違いなく空ではなく、まだ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"; 
    } 

} 

バンドリストは、バンドが追加された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"; 
    } 
} 

したがって、ユーザは、いくつかのテキストフィールド内に充填されたいくつかの他のクラスでは、バンドは、バンドリストに追加され、したがって、私はsaveListsToStorage()を呼び出します。アプリケーションの起動時にアプリケーションがストレージ内のデータを探している

public void saveListsToStorage(){ 
     Storage.getInstance().clearStorage(); 
     Storage.getInstance().writeObject("Bands", 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(); 
    } 

をしてからロードし、それはにNullPointer例外をスローし、I理由を知りません。私はShaiが私に言ったようにLinkedListの代わりにArrayListを使用しました。ガイドで説明したようにExternalizable Interfaceを実装しました。

多分あなたの何人かがここで何が間違っているか教えてくれるかもしれません。

編集:ここでは

は例外です:

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 Listを反復処理してBandsContainerを更新し、各バンドをButtonとして追加します。 –

+0

コードは何ですか、特に95行ですか? –

答えて

1

彼らは把握しやすいだけでなくので、NullPointerExceptionsがが、かなり驚くべきものです、彼らはあなたに彼らが起こる正確な線を示しています。 .の左にあるものを見て、それがヌルであるかどうかを確認するだけです。それを見つけるとすぐに、問題が見つかります。

コードを見てみましょう。悲しいことに私はどちらの行が95行目かわからないが、それはifで始まる行だと推測している。

これは、bandListがnullまたはがnullを返すことを意味します。 getBandList()を見てみると、BandListクラスのコンストラクタでリストを初期化すると、nullにならないことがわかります。それだけがbandListになります。

BandList bandList = loadSavedBandList(); 

それでは、そのメソッドに見てみましょう:

悲しいことに、あなたがからのことだどこあなたが投稿していなかったが、私はつもりはあなただけのようなものがなかったと仮定します。(btw:この回答の最後にこれをやっていない場合、あなたが見なければならないところについてもう少し詳しく述べる)。

キーが見つからない場合は、新しいBandListが返されますが、nullにすることはできません。だから、何かを見つけなければならない。つまり、キーは存在するが、値はヌルである。

もう一度やり、最初に物事を保存する方法を見てみましょう。

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

"他のクラスでは"実際にはあまり説明しません。しかし、あなたがヌルを読んでいるので、あなたがここでヌルを書いていることを意味します。少なくともこの方法では、この "他の階級"の意味は、bandList = nullです。

あなたが与えたコードでは、この問題をもっと深く見ることはできませんが、 "他のクラス"のように、bandListという名前のクラス属性がありますが、その中に何かを入れることはできません。


それともあなたは右のすべてを保存するだけでなく、かなり多くの問題を説明するだろういくつかのフォームまたはおif前に別の、に

BandList bandList = loadSavedBandList(); 

を呼び出していませんでした。つまり、バンドリストをロードしないと、明らかにヌルになります。

関連する問題