Je suppose que les conditions de la Javadoc pour savoir quand NullPointerException
peuvent être lancés par removeAll
sont inexactes.
TreeSet
's removeAll
s'appuie sur AbstractSet
La mise en œuvre de la directive. Cette implémentation itère sur tous les éléments du plus petit des deux ensembles.
Dans votre extrait, il s'agit de la fonction HashSet
qui contient le null
élément. Ainsi, removeAll
itère sur les HashSet
et tente de retirer chaque élément qu'il trouve du TreeSet
.
Cependant, remove
de TreeSet
lance un NullPointerException
lorsqu'on essaie de supprimer un null
élément de l'ensemble qui uses natural ordering, or its comparator does not permit null elements
.
Pour résumer, le NullPointerException
est causée par TreeSet
's remove()
qui est expliqué dans la Javadoc de l'application remove()
:
Les lancers :
ClassCastException - si l'objet spécifié ne peut pas être comparé aux éléments actuellement dans cet ensemble
NullPointerException - si l'élément spécifié est nul et que cet ensemble utilise un ordre naturel. ou son comparateur n'autorise pas les éléments nuls.
Il est intéressant de noter que l'ajout d'un élément supplémentaire à l'indice HashSet
éliminerait le NullPointerException
puisque dans ce cas, les deux Set
auraient la même taille, et la mise en œuvre de l'option removeAll()
itèrerait sur les éléments du TreeSet
.