2017-07-19 18 views
1

BlueJを使用して、HashMapクラスをテストして動作を確認しています。以下は、私がクラスをテストするために使用したコードです。コンストラクタでfillMyMap()メソッドを呼び出す最初の試みの間、23行目にスローされるエラーがあります。Java HashMapクラスがNullPointerExceptionをスローする

コンストラクタ内のfillMyMap()への呼び出しを削除しようとしました。 HashMapTesterオブジェクトはインスタンス化されていますが、そのメソッドを明示的に呼び出すと同じNullPointerExceptionがスローされます。

IはmyMap変数宣言を書き換えるが、コンパイルの失敗に異なる構文結果を使用してみました。

他のHashMapコード(たとえば、Objects First with BlueJ)をテストしたところ、そのコードは正常に動作しているため、ライブラリ、クラス、またはパッケージに問題はありません。

私は変数を変更しようとしましたが、私は誤って予約語を打ちました。同じ結果です。このコードで何が問題になっていますか?

import java.util.HashMap; 

public class HashMapTester 
{ 
    //Fields 
    public HashMap<String, String> myMap; 

    // The constructor is supposed to construct a new 
    // HashMap object with variable name myMap. 
    // The fillMyMap() method call simply fills the HashMap 
    // with data prior to testing it. 
    public HashMapTester() 
    { 
     HashMap<String, String> myMap = new HashMap<String, String>(); 
     fillMyMap(); 
    } 

    // fillMyMap() methods is supposed to fill up 
    // the keys and values of the HashMap<String, String> 
    // object. 
    public void fillMyMap() 
    { 
     myMap.put("doe", "A deer...a female deer."); //<-- ERROR OCCURS HERE! 
     myMap.put("ray", "A drop of golden sun."); 
     myMap.put("me", "A name I call myself."); 
     myMap.put("fah", "A long, long way to run."); 
     myMap.put("sew", "A needle sewing thread."); 
     myMap.put("la", "A note to follow sew."); 
     myMap.put("tea", "It goes with jam and bread."); 
    } 

    public String sing(String note) 
    { 
     String song = myMap.get(note);  
     return song; 
    } 
} 

答えて

3
HashMap<String, String> myMap = new HashMap<String, String>(); 

は、フィールド変数をインスタンス化していない、コンストラクタ内のローカル変数を宣言しています。

使用

this.myMap = new HashMap<String, String>(); 
+0

ありがとうございました!今は完璧に動作します。 – Andy

+0

私は 'this'キーワードを削除することによっても動作させることができました。 – Andy

+1

はい、この場合は必要ありません。名前をあいまいにするだけでよいでしょう。例えば、コンストラクタにも 'myMap'という名前のパラメータがあるとします。 'this.myMap'はクラスフィールドを参照し、単に' myMap'がパラメータを参照します。あなたの例では 'myMap'という名前の変数が1つしかないので、これは必要ではありません –

1

コンストラクタにローカル変数を作成しています。インスタンス変数を初期化していません。

1

あなたはHashMap<String,String> myMap=new HashMap<String,String>();(最初のビットのストレスを)書いたので、それはです。ここで新しいローカル変数を宣言しています。

HashMapTester()機能は次のようになります。あなたのコンストラクタで

public HashMapTester(){ 
    this.myMap=new HashMap<String,String>(); 
    fillMyMap(); 
} 
0

あなたは、これはあなたがフィールド変数をインスタンス化する方法です

this.myMap = new HashMap<String, String>(); 

を使用しなければならないとき、uは

HashMap<String,String> myMap=new HashMap<String,String>(); 

を使用しています新しいローカル変数マップを宣言するだけではありません。

1

最短、最も単純な修正。これを消去:HashMap<String, String>

import java.util.HashMap; 
 

 
public class HashMapTester { 
 
    public HashMap<String, String> myMap; 
 

 
    public HashMapTester(){ 
 
     myMap = new HashMap<String, String>(); //<-- I WAS THE ERROR 
 
     fillMyMap(); 
 
    } 
 

 
    public void fillMyMap() { 
 
     myMap.put("doe", "A deer...a female deer."); //<--NO ERROR OCCURS HERE! 
 
     myMap.put("ray", "A drop of golden sun."); 
 
     myMap.put("me", "A name I call myself."); 
 
     myMap.put("fah", "A long, long way to run."); 
 
     myMap.put("sew", "A needle sewing thread."); 
 
     myMap.put("la", "A note to follow sew."); 
 
     myMap.put("tea", "It goes with jam and bread."); 
 
    } 
 

 
    public String sing(String note){ 
 
     String song = myMap.get(note);  
 
     return song; 
 
    } 
 
}

+0

私はあなたが新しいエラー位置を示したという事実を愛しています!非常に賢い。 – Andy

+1

あなたはそれを知っています、私は他人を助けるために努力しています。私はNull Pointer Exceptionsに関するエッセイを書くつもりだった。 –

関連する問題