5

我想我可能在这里遗漏了一些明显的东西,但无论如何让我们看看代码。

public static class FreeMap extends TreeMap<String, Integer> {
    @Override
    public Integer put(String key, Integer value) {
        out.println(super.toString());
        out.println(super.getClass().getName()+" "+key+" : "+value);
        int i = super.put(key, value);//line 227
        assert this.size() == 1;
        return i;
    }

}
public static void main(String[] args) {
    FreeMap fm = new FreeMap();
    fm.put("A", 10);
}

在运行此程序时,您将获得如下输出:

{}
com.xxxxxxxxxxxxxxxxxxxxxxxx.Graph$FreeMap A : 10
Exception in thread "main" java.lang.NullPointerException
at com.xxxxxxxxxxxxxxxxxxxxxxxx.Graph$FreeMap.put(Graph.java:227)
at com.xxxxxxxxxxxxxxxxxxxxxxxx.Graph.main(Graph.java:212)

我可以看到 super 指的是 FreeMap,而不是 TreeMap,如果它会引发我可以理解的 StackOverflow 异常。为什么是空指针异常?

提前致谢

4

1 回答 1

11

是的,因为put返回前一个值:

返回:
与 key 关联的前一个值,如果没有 key 映射,则返回 null。(返回 null 还可以指示映射先前将 null 与 key 关联。)

没有先前值,所以它正在返回null,然后您将其拆箱,从而导致异常。

鉴于您的方法已经声明为 return Integer,修复很容易。改变这个:

int i = super.put(key, value);

对此:

Integer i = super.put(key, value);

或者理想情况下,为了可读性:

Integer oldValue = super.put(key, value);

请注意,在密钥已经有值的情况下,这也会更有效- 拆箱和重新装箱没有任何好处。

于 2013-01-12T16:56:30.967 回答