java.util.HashSet中的映射如何变为null

时间:2018-07-25 06:59:40

标签: java nullpointerexception thread-safety hashset

我在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;
}

1 个答案:

答案 0 :(得分:0)

我认为其他线程可能会有问题,因为在此代码中,它永远不会更改映射。它只是在做conatinsKey检查,witch不会改变地图。

您需要检查(在各个线程中)哪些位置(正在更改地图中的内容),以便进行验证。