2

我为此花了几个小时的时间,但需要继续并找到一个丑陋的解决方法,但我很乐意清理我的代码,这是问题所在:

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<String, Float> map已正确初始化并且不包含任何空值。

附带说明一下,如果我将参数更改为 Map map 并仅使用字符串对,则 function1 可以正常工作。我的目标是只有一个泛型函数Map<? extends Object, ? extends Object> map可以用于两种类型的地图。

任何建议表示赞赏,谢谢!托马斯


编辑:我添加了一些非常基本的内省以使该函数与泛型一起使用。我可以确认在使用键集时我仍然得到空值,而我按照下面的建议来使用条目集。下面是我的代码(第一个函数工作正常,而第二个函数返回空元素。

// 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;
}
4

2 回答 2

1

您可能在地图中插入了 NULL 键字符串。这在使用 HashMap 时是可能的。尽量避免添加 NULL 键。此外,您可以使用 TreeMap。

顺便说一句,遍历条目集也不错,您可以像在 function1 中所做的那样,在 function2 中使用 foreach 来清理代码:

这看起来像:

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

虽然没有必要清理function2。但是您应该找到将 NULL 键插入地图的位置。

于 2012-11-18T13:33:09.757 回答
0

function1 使用了一个 foreach 循环,当 map 为 null 时会抛出 NullPointerException。在使用 foreach 迭代之前,您应该检查地图是否为空

进一步你应该重写丑陋的

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

 if (entry.getKey().getClass() == String.class) {
于 2012-11-18T17:50:05.330 回答