Collection.removeAll() 的文档中:



但是下面的代码仍然会抛出 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中删除找到的每个元素。

但是,尝试从设置的remove中删除TreeSet元素时,NullPointerExceptionnull抛出uses natural ordering, or its comparator does not permit null elements

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



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

10-08 16:09