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

标签 java nullpointerexception thread-safety hashset

我在 myset.contains(obj) 和堆栈跟踪中遇到 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是空的,而我的HashSet对象不是。 但是HashSet的每个init方法都会创建一个HashMap对象并分配给map,就像

public HashSet() {
    map = new HashMap<>();
}

所以我的问题是,为什么map在第203行会变成空?

这种情况有时会发生在我们的网络服务器中,myset 被多个线程使用。我知道非线程安全的 HashSet 上可能存在不一致的问题,但我不明白为什么它变成了空。

提前致谢。

在这里发布我的代码:

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

最佳答案

我认为其他线程可能存在问题,因为在这段代码中,它永远不会更改 map 。它只是进行 conatinsKey 检查,不会改变 map 。

您需要检查 map 中的哪些位置(在各个线程中)正在进行更改,以便验证这一点。

关于java - java.util.HashSet 中的映射如何变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51512661/

相关文章:

java - 外键约束在多对多 Hibernate 关系上失败

java - 客户端上的休息请求套接字超时 - Web 服务中的远程请求会发生什么情况

java - 局部变量的线程安全

java - RabbitTemplate convertAndSend 上的 Spring Amqp 内部 NullPointerException

java - 空安全 boolean 表达式评估

java - DefaultThreadFactory本身是线程安全的吗?

dom api上的java多线程

java - java中如何检查字符串是否具有全角字符

Java 如何在Java中为SQLITE创建查询队列以防止数据丢失?

java - JFreeChart 从另一个 JDialog 接收方程产生 "AWT-EventQueue-0"java.lang.NullPointerException