gpt4 book ai didi

java - removeAll() 时 TreeSet 中的 NullPointerException

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:41 26 4
gpt4 key购买 nike

来自 Collection.removeAll() 的文档:

Throws: NullPointerException - if this collection contains one or more null elements and the specified collection does not support null elements (optional), or if the specified collection is null.

但下面的代码仍然抛出 NullPointerException :

public class TestSet { 
public static void main(String[] args) {
Set set1 = new TreeSet();
set1.add("A");
set1.add("B");
Set set2 = new HashSet();
set2.add(null);
set1.removeAll(set2);
}
}

谁能帮我理解这种行为?

最佳答案

我猜 Javadoc 关于 NullPointerException 何时可能被 removeAll 抛出的条件是不准确的。

TreeSetremoveAll 依赖于 AbstractSet 的实现。该实现迭代了两个集合中较小者的所有元素。

在您的代码段中,这是 HashSet,其中包含 null 元素。因此 removeAll 遍历 HashSet 并尝试从 TreeSet 中删除它找到的每个元素。

但是,TreeSetremove 在尝试从集合中删除 null 元素时抛出 NullPointerException 使用自然顺序,或者它的比较器不允许空元素

总而言之,NullPointerException是由TreeSetremove()引起的,在remove的Javadoc中有解释():

Throws:

ClassCastException - if the specified object cannot be compared with the elements currently in this set

NullPointerException - if the specified element is null and this set uses natural ordering, or its comparator does not permit null elements

有趣的是,向 HashSet 添加一个元素会消除 NullPointerException,因为在这种情况下,两个 Set 都会有相同的大小,并且 removeAll() 的实现将迭代 TreeSet 的元素。

关于java - removeAll() 时 TreeSet 中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44564757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com