使用List时出现 java.lang.UnsupportedOperationException

今天使用List时出现java.lang.UnsupportedOperationException

代码如下:

List lists = Collections.emptyList();
lists.add("aa");
lists.add("cc");
lists.add("bb");

运行出现

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)

随后查看了下源码 , 大致发现了原因 , 在Collections 类中 ,定义了一个final常量EMPTY_LIST ,默认创建了实例EmptyList , 随后在调用Collections.emptyList() 过程中 , 将该常量EMPTY_LIST 返回 ,而EmptyList 类并没有add() 方法 , 如图:

EMPTY_LIST常量:
使用List时出现 java.lang.UnsupportedOperationException_第1张图片
EmptyList类源码:

 /**
     * @serial include
     */
    private static class EmptyList
        extends AbstractList
        implements RandomAccess, Serializable {
        private static final long serialVersionUID = 8842843931221139166L;

        public Iterator iterator() {
            return emptyIterator();
        }
        public ListIterator listIterator() {
            return emptyListIterator();
        }

        public int size() {return 0;}
        public boolean isEmpty() {return true;}

        public boolean contains(Object obj) {return false;}
        public boolean containsAll(Collection c) { return c.isEmpty(); }

        public Object[] toArray() { return new Object[0]; }

        public  T[] toArray(T[] a) {
            if (a.length > 0)
                a[0] = null;
            return a;
        }

        public E get(int index) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }

        public boolean equals(Object o) {
            return (o instanceof List) && ((List)o).isEmpty();
        }

        public int hashCode() { return 1; }

        @Override
        public boolean removeIf(Predicate filter) {
            Objects.requireNonNull(filter);
            return false;
        }
        @Override
        public void replaceAll(UnaryOperator operator) {
            Objects.requireNonNull(operator);
        }
        @Override
        public void sort(Comparator c) {
        }

        // Override default methods in Collection
        @Override
        public void forEach(Consumer action) {
            Objects.requireNonNull(action);
        }

        @Override
        public Spliterator spliterator() { return Spliterators.emptySpliterator(); }

        // Preserves singleton property
        private Object readResolve() {
            return EMPTY_LIST;
        }
    }

emptyList()方法:
使用List时出现 java.lang.UnsupportedOperationException_第2张图片

所以 Collections.EMPTY_LIST or Collections.emptyList()返回的这个空的List是不能进行添加元素这类操作的 , 我试了size()是可以的 , 还没完全弄透彻 , 持续更新…

你可能感兴趣的:(Emptylist,java)