我在myset.contains(obj)和stacktrace处获得了NullPointerException,如下所示:
java.lang.NullPointerException: null
at java.util.HashSet.contains(HashSet.java:203) ~[?:1.8.0_131]
我查看了HashSet的源代码,
private transient HashMap<E,Object> map;
...
202 public boolean contains(Object o) {
203 return map.containsKey(o);
204 }
似乎 map 为null,而我的HashSet对象不是。 但是HashSet的每个init方法都会创建一个HashMap对象,并分配给地图,例如
public HashSet() {
map = new HashMap<>();
}
所以我的问题是,为什么 map 在203行中为空?
这有时在我们的Web服务器中发生,myset被多个线程使用。我知道在非线程安全的HashSet上可能存在不一致的问题,但我不知道为什么它变为null。
谢谢。
在这里发布我的代码:
Set<String> tags = data.getTags();
if (tags.contains(tmp.toString())) {
return true;
}
数据的类定义
,可通过多个线程访问:class Data
private Set<String> tags;
public Set<String> getTags() {
if (tags == null) {
tags = new HashSet<String>();
// add something to tags
}
return tags;
}
答案 0 :(得分:0)
我认为其他线程可能会有问题,因为在此代码中,它永远不会更改映射。它只是在做conatinsKey检查,witch不会改变地图。
您需要检查(在各个线程中)哪些位置(正在更改地图中的内容),以便进行验证。