2013-02-27 111 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

相关问题