1 回答

TA貢獻1860條經驗 獲得超9個贊
您已經愛上了 Check-Then-Act 反模式。它意味著檢查條件(如密鑰的存在),然后對其采取行動(如調用get),忽略條件可能在其間發生變化的可能性。
因此,您在迭代時遇到了一個特定的鍵conMap.keySet(),但在您調用conMap.get(objId)時,該鍵可能不再位于映射中,返回時會報告這一點null。
強烈建議使用具有合適hashCode/equals實現的鍵類型,這樣您就無需遍歷整個地圖來查找匹配項,而是可以使用單個get(id).
但是,當您必須遍歷映射并需要值時,請遍歷條目集而不是鍵集。
public void doSomething(MyObj id){
// see https://stackoverflow.com/q/322715/2711488
List<Map<String, List<String>>> mapsList = new ArrayList<>();
for(Map.Entry<MyObj, Map<String, List<String>>> e: conMap.entrySet()){
if(e.getKey().key1.equals(id.key1)){
mapsList.add(e.getValue());
}
}
for(Map<String, List<String>> map: mapsList){
synchronized(map) {
//...
}
}
}
添加回答
舉報