从 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
的条件是不准确的。TreeSet
的removeAll
取决于AbstractSet
的实现。该实现迭代了两组中较小者的所有元素。
在您的代码段中,这是HashSet
,其中包含null
元素。因此,removeAll
遍历HashSet
并尝试从TreeSet
中删除找到的每个元素。
但是,尝试从设置的remove
中删除TreeSet
元素时,NullPointerException
的null
抛出uses natural ordering, or its comparator does not permit null elements
。
总而言之,NullPointerException
是由TreeSet
的remove()
引起的,这在remove()
的Javadoc中进行了解释:
有趣的是,在HashSet
中再增加一个元素将消除NullPointerException
,因为在这种情况下,两个Set
的大小都相同,并且removeAll()
的实现将迭代TreeSet
的元素。