Map.getOrDefault踩坑

背景

作为java开发者,在平时开发过程中大量使用到Map类,而Map.gett方法的获取值可能为null,因此为了方便就可能使用Map.getOrDefault,示例代码如下:

    public static void main(String[] args) {
        final Map<String, Object> map = Maps.newHashMap();
        map.put("main", null);
        final String main = map.getOrDefault("main", "--").toString();
        System.out.println("main = " + main);
    }

在运行后,发现报错空指针,报错信息如下

排查

查看源码如下:

default V getOrDefault(Object key, V defaultValue) {
    V v;
    return (((v = get(key)) != null) || containsKey(key))
            ? v
            : defaultValue;
}

总结:

竟然是||运算,如果containsKey 或者getkey() != null 则获取;

如果包含key的value为null,则会获取null值导致空指针;

解决

建议使用java8的Optional来判空,如下:

Optional.ofNullable(map.get("account")).orElse("--");