我有一个ConcurrentHashMap
public static Map<Short, Long> timer = new ConcurrentHashMap<Short, Long>();
此共享内存中的元素可能由两个线程添加或删除。当我尝试访问线程中的一个值时,如何摆脱java.lang.NullPointerException?
答案 0 :(得分:1)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null。
更正式地说,如果此映射包含从键k到值v的映射,使得key.equals(k),则此方法返回v;否则返回null。 (最多可以有一个这样的映射。)
抛出: NullPointerException - 如果指定的键为空
如您所见,如果给定的键为空,它只会抛出NullPointerException
。但是,如果没有与给定键关联的任何内容,它也会返回null。
以下是一个可以使用多线程的示例:
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
String key = "mykey";
String value = map.get(key);
if (value != null) {
// use value
} else {
// no mapping for the given key
}
您不需要同步,因为get()
操作是原子操作。此外,只要确保密钥永远不为空,就不会抛出NullPointerException
。
答案 1 :(得分:0)
我认为NULL检查是摆脱nullpointer异常的唯一方法。因为根据定义,并发hashmap将允许您从多个线程添加或删除。
您总是可以编写像
这样的代码不推荐:
Map map = new ConcurrentHashMap<>();
synchronized(map){
if(map.containcKey(key)){
///blah blah blah
}
}
这将帮助您避免nullpointer,但它无视使用并发hashmap的目的。因此,在我看来,拥有代码故障安全是唯一的选择。
答案 2 :(得分:0)
你可以这样试试:
Map<String, Optional<String>> map = new ConcurrentHashMap<>();
map.getOrDefault(key, Optional.empty()).map(value -> /* do actual stuff here*/);