2017-07-19 73 views
1

我正在使用BlueJ並測試HashMap類來查看它是如何工作的。以下是我用來測試課程的代碼。第一次嘗試在構造函數中調用fillMyMap()方法時,會在第23行中引發錯誤。Java HashMap類拋出一個NullPointerException

我試着在構造函數中刪除對fillMyMap()的調用。 HashMapTester對象被實例化,但當我明確調用該方法時拋出相同的NullPointerException

我試着重寫myMap變量聲明,但使用不同的語法會導致編譯失敗。我已經測試了其他HashMap代碼(例如,來自Objects First with BlueJ),並且代碼運行良好,所以沒有Library,Class或Package問題。

我試着改變變量,以爲我不小心碰到了一個保留字。結果相同。這段代碼有什麼問題?

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

這是因爲你寫(在第一位應力)HashMap<String,String> myMap=new HashMap<String,String>();。你在這裏聲明一個新的局部變量。

HashMapTester()功能應該是:

public HashMapTester(){ 
    this.myMap=new HashMap<String,String>(); 
    fillMyMap(); 
} 
0
在構造函數

u的使用

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

時,你應該使用

this.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

是啊,你知道嗎,我盡力去幫助別人。我甚至要寫一篇關於空指針例外的文章。 –

相關問題