2013-02-27 2 views
0

값에 대한 ArrayList의 HashMap을 가지고 있지만 ArrayList를 추가 할 때 HashMap이 비어 있고 ArrayList를 가져 오려고하면 NullPointerException이 throw됩니다. 매우 혼란.nullpointerexception이 발생하는 ArrayList의 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

+0

코드를 보면 참조를 취소하려고 시도하는 키가있을 것이라고 기대할 필요가 없습니다. _put_을 사용할 때 사용하는 키는 _get_ 사용할 때 사용하는 키와 완전히 다릅니다. – jahroy

답변

3

여기서 cardSuit (randCard)는지도에없는 것을 반환합니다.

키로 x+""을 넣고 있습니다. 사용하는 경우 당신이 검색하는

는하지만이 : 당신은 키를 사용하여지도에 값을 옮기고

x+"something"

+0

대부분 코드가 아닌 전체 답변이 아닌 코드와 유사한 사항에 대해 코드 서식을 사용해보십시오. –

5

다음과 같이한다 :

someInt + "" 

당신이 얻고있는 값을 다음과 같은 키가있는지도에서 :

someInt + cardSuit(randCard) 

cardSuit이 항상 빈 문자열을 반환하지 않는 한, 다른 키가 될 것입니다.

+0

죄송합니다, 디버깅 중에 변경했지만 문제가 아닙니다. HashMap은 코드 실행 중 크기가 증가하지 않으며 size = 0으로 유지됩니다. –

+0

@WarrenGreen을 명확히하지 못해 죄송합니다. 그건 절대 불가능합니다. 코드는 적어도 _Hands_라는 맵에 값을 넣어야합니다. for 루프는 반드시 실행되어야하며 (첫 번째 반복에서 Exception을 throw하지 않는 한) 모든 반복에서 값을 맵에 배치합니다. – jahroy

+0

@WarrenGreen - 디버그 문을 추가해야합니다 (디버거를 사용하는 것이 더 낫습니다). 무언가를지도에 넣을 때마다 키와 값을 인쇄하십시오. 'Map.get'을 호출하기 전에, 키를 출력하고'Map.containsKey'를 호출하여 요소가 존재하는지 확인해야합니다. – jahroy

관련 문제