2010-08-17 1 views
1

문자열 배열이 HashMap (rMap) 인 함수가 있습니다. 특정 조건 (예 : r.Map.size() != 0)을 충족하면 다른 파일 (rMap은 글로벌 변수)에서 String array[] = rMap.get(0)을 호출하여 System.out.println(array[0])으로 시도합니다.데이터를 이동할 때 널 포인터가 생깁니다.

프로그램 실행과 그 결과로 NULL 포인터가 System.out.println(array[0]);이됩니다. 누구나 이런 일이 일어나는 이유는 무엇입니까?

편집 : 배열의 모든 값이 문자열 변수는 어디 ...과 같이

String center[] = new String[] { tname, tmessage, tlink, tsname }; 
Global.rMap.put(index, center); 

를지도를 작성하고 있습니다. 그래서 값을 tname에 접근하고있어 null과 같지 않습니다. 나는 확인했다. 내 키 값은 문자열입니다

+0

코드를 조금만 추가하면 색인을 설정하는 대상을 명시 적으로 볼 수 있습니까? – atk

답변

0

HashMap은 null 값을 허용하므로 String array[] =rMap.get(0);을 사용하는 값이 null 일 수 있습니다. null 배열에 액세스하면 NPE가 throw됩니다.

1

지도 작성 방법은 무엇입니까? Integer 키가 0이 아닌 널 (null)이 아닌 항목을 0으로 두는 것이 확실합니까?

글쎄, 우리는 꽤 확신 할 수 있습니다. 가능한 원인 :

  • 결과 충전 코드에서 오류
  • 당신은 키와 Short 또는 Byte 객체를 사용하고 실행하거나 다른 키 값을하지 넣어 구성
  • 당신은있어 0

아래지도에 null 값을 퍼팅 당신은 디버거에서 코드를 실행하고지도의 내용을보고 자신을 위해이 질문에 대답 할 수 있습니다.

는 업데이트 :

내 주요 가치는 바로 거기 당신의 문제입니다, 문자열

에게 잘입니다. rMap.get(0)Integer을 찾고 문자열 "0"에 대한 항목과 일치하지 않습니다. 값 (또는 null)는 키 0 함께 RMAP 첨가되지 않아

+0

질문을 반영하도록 제 코드를 업데이트했습니다. – Skizit

+0

@Meowmix : 업데이트를 반영하도록 답변을 업데이트했습니다. –

1

array 참조 가능성 널이다.

가능한 경우 제네릭을 사용하여 키가 올바른 유형인지 확인하십시오. array을 가져 오기 전에지도의 값을 인쇄하여지도에 무엇이 있는지 볼 수도 있습니다. rMap에 시계가있는 디버거로 코드를 실행하면지도에 포함 된 내용과 변경된시기가 표시됩니다.

0

HashMap의 get() 메소드는 원하는 값을 식별하는 데 인덱스가 아닌 키를 사용합니다. 순서가 지정된 항목 목록을 원한다면 List 하위 클래스를 사용해야합니다 (또는 순서 지정, yaourself). 해시 맵을 사용하려면 keys() 메소드를 사용하여 모든 맵 키의 열거를 가져옵니다.

또한

것은, 당신이 만들 수없는 매우 조심해야합니다 (그것은 문제가되지 않습니다, 비록 같은 텍스트 아래에 떠나. 설명에 의문을 제기하기 때문에, 그것은 중요한 고려 사항이며, 텍스트 위의 제거) 경쟁 조건, 당신은 스레드를 통해 작업하고 있기 때문에. Java의 원시 Hashtable은 동기화되어 있지만 데이터가 있음을 의미하지는 않습니다. 즉, 하나의 htread에서 MyObj obj = get (xxx)을 할 수 있습니다. Nd는 두 개의 개별 스레드에서 obj를 조작하기 시작할 수 있습니다. 응용 프로그램에 따라 Hashtable.remove()를 사용하여 데이터가지도에서 사라져 재사용 할 수 없거나 일부 동기화 된 블록이 필요할 수 있습니다 (remove()가 더 간단한 구현 일 수 있음). 지도가 먼저 데이터를 가지고 있고 데이터가 없어지면 조건을 정상적으로 처리해야합니다.

0

Map 구현의 get 메소드를 호출하면 java.util.Map의 get 메소드의 서명이 get (java.lang.Object)이므로 모든 객체가 인수로 허용됩니다.

잘 작동하는 키는 문자열 (값 = 0)을 키로 전달하거나 java.lang.String 객체가 아닌 인수 객체의 hashCode 및 equals 메소드를 대체합니다.