繁体   English   中英

java.util.TreeMap的子类在call put(key,value)方法上给出NullPointerException

[英]The Subclass of java.util.TreeMap gives NullPointerException on call put(key, value) method

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

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异常。 为什么nullpointerexception?

提前致谢

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

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

没有以前的值,所以它的返回null ,这你再拆箱,导致异常。

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

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

对此:

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

或者理想情况下,为了便于阅读:

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

请注意,这也将是在已经一个该键的值的情况下更有效的-有没有从拆箱和reboxing效益。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM