简体   繁体   中英

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

I guess I might be missing something obvious here, but anyway lets see the code.

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);
}

On Running this you will get a output as following:

{}
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)

I can see super is referring to FreeMap, not TreeMap, if it would have thrown a StackOverflow Exception I could have understood. Why nullpointerexception?

Thanks in advance

Yes, because put returns the previous value:

Returns:
the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key.)

There is no previous value, so it's returning null , which you're then unboxing, leading to an exception.

Given that your method is already declared to return Integer , the fix is easy. Change this:

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

to this:

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

Or ideally, for readability:

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

Note that this would also be more efficient in the case that there was already a value for the key - there's no benefit from unboxing and reboxing.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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