在 Java SE 8 之前,如果集合本身为空,那么 Collection.removeAll(Collection) 和 retainAll(Collection) 的大多数实现都会返回 false 并以静默方式忽略空参数。在 Java 8 中,如果将空值提供为参数,那么所有集合实现都会抛出 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 文档。