Вы влюбились в анти-паттерн «Проверьте, затем-Действуйте».Это подразумевает проверку условия (например, наличие ключа) с последующим воздействием на него (например, вызовом 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) {
//...
}
}
}