몇 시간 동안 두뇌를 부러 뜨 렸지만 계속 진행해야하고 추악한 해결 방법을 찾았지만 정리할 수는 있습니다. 물론 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;
}
방법으로 재 작성해야에게 foreach 문으로 반복하기 전에 NOT NULL로지도를 확인해야합니까? 해당 스 니펫을 게시 할 수 있습니까? – kosa
지도 데이터를 표시하십시오. 전체 코드를 표시 할 수있는 경우 – sunleo
아래의 답변에 대한 스 니펫을 추가하십시오. 나는이 문자열이 null이 아니기 때문에 map.toString()을 호출하면 정상적으로 전체 내용을 읽을 수 있기 때문에 – gru