2013-02-27 3 views
0

У меня есть HashMap of ArrayLists для значений, но HashMap остается пустым, когда я добавляю ArrayLists, а затем бросает исключение NullPointerException, когда пытаюсь получить() ArrayList. Очень смущенный.HashMap of ArrayList, вызывающий nullpointerexception

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

+0

Глядя на ваш код, нет причин ожидать, что любой из ключей, которые вы пытаетесь разыменовать, будет присутствовать. Эти клавиши вы используете, когда вы _put_ полностью отличаетесь от ключей, которые вы используете, когда вы _get_. – jahroy

ответ

3

Здесь cardSuit (randCard) возвращает то, что нет на карте.

Вы вводите x+"" в качестве ключей.

Но когда вы запрашиваете, что вы используете это:

x+"something"

+0

Пожалуйста, попробуйте использовать форматирование кода для кодовых вещей, а не целые ответы, которые в основном не являются кодом. –

5

Ты ставишь значение в карту с ключами, которые выглядят следующим образом:

someInt + "" 

Вы получаете значение от карты с такими клавишами, как:

someInt + cardSuit(randCard) 

Если cardSuit всегда возвращает пустую строку, это будут разные ключи.

+0

Извините, я изменил его во время отладки, но это не проблема. HashMap никогда не увеличивается в размере во время выполнения кода и остается при размере = 0. Извините, что не уточнил –

+0

@WarrenGreen - Это абсолютно невозможно. Ваш код должен поместить значения, по крайней мере, в карту с именем _Hands_. Ваш цикл цикла обязательно выполнится и (если только он не выбрасывает исключение на первой итерации), он будет помещать значение в карту на каждой итерации. – jahroy

+0

@WarrenGreen - Вы должны добавить операторы отладки (лучше использовать отладчик), чтобы узнать, что делает ваш код. Каждый раз, когда вы кладете что-то на карту, распечатайте ключ и значение. Прежде чем вы назовете «Map.get», вы должны распечатать ключ и проверить, существует ли этот элемент, вызывая «Map.containsKey». – jahroy

Смежные вопросы