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("--");