Java SE 8 より前では、ほとんどの Collection.removeAll(Collection) の実装と retainAll(Collection) の実装が、そのコレクション自体が空の場合に、false を返して NULL パラメーターを暗黙的に無視します。Java 8 では、NULL がパラメーターとして指定されたら、すべてのコレクションの実装が NullPointerException をスローします。
この規則により、これらの例外がどこで発生する可能性があるかを特定するために、以下の実装やインターフェースでの removeAll(Collection) メソッドと retainAll(Collection) メソッドの呼び出しにフラグを立てることで、予期しない NullPointerException を防ぐためのロジックを評価できるようにします。
- java.util.ArrayDeque
- java.util.ArrayList
- java.util.Collection
- java.util.Deque
- java.util.EnumSet
- java.util.LinkedList
- java.util.List
- java.util.NavigableSet
- java.util.PriorityQueue
- java.util.PriorityQueue
- java.util.Queue
- java.util.Set
- java.util.SortedSet
- java.util.Stack
- java.util.Vector
- java.util.concurrent.ArrayBlockingQueue
- java.util.concurrent.BlockingDeque
- java.util.concurrent.BlockingQueue
- java.util.concurrent.ConcurrentLinkedDeque
- java.util.concurrent.ConcurrentLinkedQueue
- java.util.concurrent.CopyOnWriteArrayList
- java.util.concurrent.CopyOnWriteArraySet
- java.util.concurrent.DelayQueue
- java.util.concurrent.LinkedBlockingDeque
- java.util.concurrent.LinkedBlockingQueue
- java.util.concurrent.LinkedTransferQueue
- java.util.concurrent.PriorityBlockingQueue
- java.util.concurrent.TransferQueue
- javax.management.AttributeList
- javax.management.relation.RoleList
- javax.management.relation.RoleList
- javax.management.relation.RoleUnresolvedList
以下の実装の場合は、retainAll(Collection) メソッドにフラグが立てられます。これらの場合、removeAll(Collection) メソッドは、Java 6 と Java 7 でも NullPointerExceptions をスローします。
- java.util.concurrent.ConcurrentSkipListSet
- java.util.HashSet
- java.util.LinkedHashSet
- java.util.TreeSet
- javax.print.attribute.standard.JobStateReasons
Java 8 では、以下のコレクションの実装では振る舞いの変更がないため、以下の場合にはこの規則によってフラグが立てられることはありません。
- java.beans.beancontext.BeanContextServicesSupport - 引き続き
UnsupportedOperationException をスローする
- java.beans.beancontext.BeanContextSupport - 引き続き
UnsupportedOperationException をスローする
- java.util.concurrent.SynchronousQueue - 引き続き Java 7 と同様に振る舞い、
NullPointerException をスローしない
java.util.Collection インターフェースとその実装に関する追加情報については、
Interface java.util.Collection に関する Java 資料を参照してください。