在某些情况下为了为了线程安全将HashMap替换为ConcurrentHashMap,但因此可能会出现NullPointerException异常。

比如当使用put方法ConcurrentHashMap中存入数据时,原来正常的业务可能会抛出NullPointerException异常。这是什么原因导致的呢?

如果通过断点跟踪会发现是在ConcurrentHashMap的put方法的此位置发生的异常。

    public V put(K key, V value) {
        return putVal(key, value, false);
    }

    /** Implementation for put and putIfAbsent */
    final V putVal(K key, V value, boolean onlyIfAbsent) {
        if (key == null || value == null) throw new NullPointerException();
    // ...
    }

看完上面代码应该就明白为什么原来正常的业务因为升级Map类型之后会导致异常了,因为ConcurrentHashMap不支持key或value为null的值。

也就是说:此类虽然与 Hashtable 相似,但与HashMap不同,它不允许将null 用作键或值。

ConcurrentHashMap不使用nulls的主要原因是在并发的情况下会存在歧义。如果map.get(key)返回是null,不能检测出是这个key创建映射的时候就是null,还是没有映射过。不是并发映射中,可以通过map.contains(key)在检查,而在并发映射中,两次调用之间的映射可能已经更改。

ConcurrentHashmapHashtable不允许key和value为null,而HashMap ,它允许key和value为null。

ConcurrentHashMap空指针异常插图
公众号:程序新视界


ConcurrentHashMap空指针异常插图1

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2019/12/22/concurrenthashmap-nullpointerexception/