2013-02-27 148 views
0

我有一個ArrayLists值的HashMap,但是當我添加ArrayLists時HashMap保持爲空,然後當我嘗試獲取ArrayList時引發NullPointerException。很困惑。ArrayList導致nullpointerexception的HashMap

Random rand = new Random(); 
HashMap<String,ArrayList<Integer>> hands = new HashMap<String,ArrayList<Integer>>(); 
HashMap<Integer, Boolean> deck = new HashMap<Integer, Boolean>(); 

for(int x=0;x<4;x++){ 
    for(int y=0;y<4;y++){ 
    hands.put(x+SUITS[x], new ArrayList<Integer>()); 
    } 
}  
    for(int x=0;x<4;x++){ 
     for(int y=0;y<13;y++){ 
      int randCard = rand.nextInt(52)+1; 
      if(!deck.containsKey(randCard)){ 
       deck.put(randCard, true); 

       hands.get(x+cardSuit(randCard)).add(randCard); 

      }else y--; 
     } 
    } 
+0

如果不能看到_cardSuit()_方法,則很難排除故障,但顯然沒有值映射到您使用的密鑰時。 – jahroy 2013-02-27 04:35:53

+0

看着你的代碼,沒有理由期望你試圖解引用的任何鍵都會出現。當_put_與您在_get_時使用的密鑰完全不同時,您使用的是您使用的密鑰。 – jahroy 2013-02-27 04:37:56

回答

3

這裏cardSuit(randCard)正在返回一些不在地圖中的東西。

您正在將x+""作爲鑰匙。

但是當你檢索你使用這樣的:

x+"something"

+0

請嘗試使用代碼格式來處理類似代碼的事情,而不是完全不是代碼的答案。 – 2013-02-27 12:38:24

5

你把值到地圖鍵看起來像這樣:

someInt + "" 

你得到的值從鍵盤看起來像這樣的地圖:

someInt + cardSuit(randCard) 

除非cardSuit總是返回一個空字符串,否則這些鍵將是不同的鍵。

+0

對不起,我在調試時更改了它,但這不是問題。在執行代碼期間,HashMap的大小不會增加,並且保持大小= 0。對不起,沒有澄清 – 2013-02-28 06:22:40

+0

@WarrenGreen - 這是絕對不可能的。您的代碼必須至少在名爲_Hands_的地圖中放置值。您的for循環肯定會執行,並且(除非它在第一次迭代時拋出一個Exception),它會在每次迭代時在地圖上放置一個值。 – jahroy 2013-02-28 06:27:48

+0

@WarrenGreen - 您應該添加調試語句(更好地使用調試器)來查看您的代碼在做什麼。每次將某些東西放入地圖時,都要打印出鍵和值。在調用'Map.get'之前,您應該打印該鍵並通過調用Map.containsKey來檢查該元素是否存在。 – jahroy 2013-02-28 06:34:25

相關問題