1. 程式人生 > >map.getOrDefault(value,defaultValue)方法的坑

map.getOrDefault(value,defaultValue)方法的坑

今天專案上線,結果竟然出現了空指標異常,很尬,趕緊排查問題。原來是沒有詳細瞭解這個方法出現的問題。

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,"")
    得到12。
    -但是,業務方竟然傳過來(userId:null)這樣的值,這時stringObjectMap.getOrDefault(value,"")得到null。再次toString時,就報空指標了。

3. 原因

  1. 還是不夠清楚,請看測試:
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字串