map.getOrDefault(value,defaultValue)方法的坑
阿新 • • 發佈:2019-01-04
今天專案上線,結果竟然出現了空指標異常,很尬,趕緊排查問題。原來是沒有詳細瞭解這個方法出現的問題。
1. 方法解釋
- Map介面的getOrDefault()方法的原始碼
default V getOrDefault(Object key, V defaultValue) {
V v;
return (((v = get(key)) != null) || containsKey(key))
? v
: defaultValue;
}
- 含義:當Map集合中包含這個key時,就使用這個key值;如果沒有,就使用預設值defaultValue。
2. 造成空指標的原因
//處理dataHolder中分開的欄位
Map<String, Object> stringObjectMap = dataHolder.toMapWithEmpty();
if(stringObjectMap!=null){
for(String value:configCache.get(TAGLOG_DATAHOLDER_FIELD)){
map.put(value,stringObjectMap.getOrDefault(value,"").toString());
}
}
- 正常情況下,stringObjectMap是一個Map,它儲存如(userId,12)這種的鍵值對。當value為userId時,
stringObjectMap.getOrDefault(value,"")
-但是,業務方竟然傳過來(userId:null)這樣的值,這時stringObjectMap.getOrDefault(value,"")
得到null。再次toString時,就報空指標了。
3. 原因
- 還是不夠清楚,請看測試:
Map<String, Object> stringObjectMap = new HashMap<>();
stringObjectMap.put("userId",null);
Object o = stringObjectMap.getOrDefault("userId","");
System.out .println(o); //null
String s = String.valueOf(stringObjectMap.getOrDefault("userId",""));
System.out.println("|"+s+"|"); //null字串