2012-11-18 5 views
1

몇 시간 동안 두뇌를 부러 뜨 렸지만 계속 진행해야하고 추악한 해결 방법을 찾았지만 정리할 수는 있습니다. 물론 Map<String, Float> map가 제대로 초기화되고있는 null 값을 포함하지 않는map.get 내부 호출 in/in 루프가 nullpointerexception을 던졌습니다. 반복자는 사용하지 않습니다.

public static void function1(Map<String, Float> map) 
{ 
    for(String key : map.keySet()) { 
     Float val = map.get(key); 
     // val is null here, throws NPE as soon as we try to use it 
    } 
} 

public static void function2(Map<String, Float> map) 
{ 
    Iterator<Entry<String, Float>> it = map.entrySet().iterator(); 
    while(it.hasNext()) { 
     Entry<String, Float> entry = it.next(); 
     String key = entry.getKey(); 
     Float val = entry.getValue(); 
     // do something with key & val, works fine 
    } 
} 

인수 : 내 코드, 여기에 문제입니다.

사이드 노트에 map 맵으로 인수를 변경하고 문자열 쌍만 사용하면 function1이 제대로 작동합니다. 내 목표는 두 유형의 맵 모두에 사용할 수있는 제네릭 Map<? extends Object, ? extends Object> map을 가진 단 하나의 기능 만 갖는 것입니다.

의견을 보내 주셔서 감사합니다. 토마스


편집 : 제네릭 함수 작업을하기 위해 정말 기본적인 성찰을 추가했다. 나는 나가 나가 entryset를 사용하기 위하여 뒤에 오는 제안을 따르는 동안 나는 아직도 열쇠 세트를 사용할 때 널 가치를 얻고 있다는 것을 확인할 수있다. 는 HashMap을 사용하는 경우 여기 아래에있는 내 코드 (1 기능이 잘 작동 두 번째 리턴하면서 null 요소입니다.

// yeah, it's aweful, but it works. 
public static JsonNode map2JSON(Map<? extends Object, ? extends Object> map) 
{ 
    ObjectNode dummyObject = Json.newObject(); 
    ArrayNode result = dummyObject.putArray("dummyKey"); 
    for(Entry<?, ?> entry : map.entrySet()) { 
     ObjectNode mapElementNode = result.addObject(); 
     if("java.lang.String".equalsIgnoreCase(entry.getKey().getClass().getName())) { 
      String key = (String)entry.getKey(); 
      if("java.lang.Float".equalsIgnoreCase(entry.getValue().getClass().getName())) { 
       Float val = (Float)entry.getValue(); 
       mapElementNode.put(key, val); 
      } else if("java.lang.String".equalsIgnoreCase(entry.getValue().getClass().getName())) { 
       String val = (String)entry.getValue(); 
       mapElementNode.put(key, val); 
      } 
     } 
    } 
    return result; 
} 

// result here contains valid keys (the string part) and null values (the float part) 
@Deprecated 
public static JsonNode mapSF2JSON(Map<String, Float> map) 
{ 
    ObjectNode dummyObject = Json.newObject(); 
    ArrayNode result = dummyObject.putArray("dummyKey"); 
    for(String key : map.keySet()) { 
     ObjectNode mapElementNode = result.addObject(); 
     mapElementNode.put(key, map.get(key)); 
    } 
    return result; 
} 
+1

방법으로 재 작성해야에게 foreach 문으로 반복하기 전에 NOT NULL로지도를 확인해야합니까? 해당 스 니펫을 게시 할 수 있습니까? – kosa

+0

지도 데이터를 표시하십시오. 전체 코드를 표시 할 수있는 경우 – sunleo

+0

아래의 답변에 대한 스 니펫을 추가하십시오. 나는이 문자열이 null이 아니기 때문에 map.toString()을 호출하면 정상적으로 전체 내용을 읽을 수 있기 때문에 – gru

답변

0

당신은 아마지도에 NULL 키 문자열을 삽입했다.이 가능합니다. 시도가 NULL 키를 추가 피하기 위해 . 또한 당신은 트리 맵을 사용할 수

안녕 당신은 기능 1에서 수행 한 것처럼, 당신은 기능 2에서 foreach 문을 사용하여 코드 를 정리할 수있는 항목 집합을 반복 할 나쁘지 않다 방법 :.

이를 다음과 같이 표시됩니다.

for(Entry<String, Float> entry : map.entrySet()) { 
    Float val = entry.getValue(); 
} 

기능 2를 정리할 필요는 없지만. 그러나 NULL 키를 맵에 삽입 한 위치를 찾아야합니다.

+0

이 답변을 주셔서 감사합니다.하지만 100 % 키가 null이 아님을 확신합니다. map.toString()을 사용하여 전체지도를 인쇄하면 잘 작동하며 내용을 볼 수 있습니다. 내가지도를 어떻게 만드는지 보여주는 스 니펫 아래에 게시. – gru

+0

Sun이 구현 한 map.toString()이 function2 (항목 세트)와 동일한 접근 방식을 사용한다는 것을 기억합니다. 그런 다음 분명히 귀하의지도에 NULL 값이 있습니다. function1에서 System.out.println ("key ="+ key + ", value ="+ value ") 행을 추가 할 수 있습니다. 그런 다음 null 값을 발생시키는 키를 보게됩니다 – AlexWien

+0

이봐, 내 맵에는 NULL 값이 없다고 맹세합니다! :) 부분적으로 해결하는 추가 코드로 위의 편집을 읽으십시오 – gru

0

function1은 맵이 null 일 때 NullPointerException을 throw하는 foreach 루프를 사용합니다. 당신이지도를 만드는 동안 문자열이 삽입

은 또한 당신은 추한

if("java.lang.String".equalsIgnoreCase(entry.getKey().getClass().getName())) { 

if (entry.getKey().getClass() == String.class) { 
+0

나는 추한 수정, 감사를 좋아합니다!그리고 아니,지도가 null이 아닙니다. (위의 코드를 읽었을 때 EDIT 아래의 첫 번째 함수가 잘 작동하고 두 번째 함수가 null을 제공하며 둘 다 같은 데이터 집합을 사용합니다.) – gru

+0

코드에서 아무 곳이나 볼 수 없습니다. 여기서지도가 인스턴스화됩니다. 어떤 코드가지도를 만드나요? 하지만 더 중요한 사항 :지도는 어떤 클래스입니까? 이 맵은 TreeMap인가, HashMap인가, 자체적으로 구현 된 맵인가, 제삼자 구현 맵인가? (System.out.println (map.getClass())을 첫 번째 줄에 넣으십시오. 전에 System.out.println ("key ="+ key + ", value ="+ value) 그 function1 또는 mapSF2JSON NullPointerException의 원인을 볼 수 있습니다. 또한 예외의 전체 stacktrace 게시 할 수 있습니다. 일부 답변을 유용한 발견 한 경우 화살표 단추를 사용하여 – AlexWien

+0

안녕하십니까, 의견을 주셔서 감사합니다.지도입니다 treemap, 비교자를 인수로 받아 들인 생성자로 만든 다음 putall을 사용하여 해시 맵에서 가져온 내용을 제공하며 키가 하나도 없으면 확실히 알 수 있습니다.이 단계에서 예외가 발생한 상태로 추적하는 것은 어렵습니다. , null 값을주는 위의 deprecated 함수를 볼 수 있습니다. 예외를 throw하는 아무 것도 실행할 필요가 없습니다. – gru

관련 문제