java.lang.UnsupportedOperationException
今天是:
我需要三件东西:爱情友谊和图书。然而这三者之间何其相通!炽热的爱情可以充实图书的内容,图书又是人们最忠实的朋友。
User Image java.lang.UnsupportedOperationException 24/Sep/2021

1.抛错代码

    public void testListAddAll(){
        List<String> list1 = Collections.EMPTY_LIST;
        List<String> list2 =new ArrayList<>();
        list2.add("sdfdsf");
        list1.addAll(list2);
    }

2.异常信息

java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at java.base/java.util.AbstractList.add(AbstractList.java:111)
	at java.base/java.util.AbstractCollection.addAll(AbstractCollection.java:352)

3.为什么会抛异常

 List<String> list1 = Collections.EMPTY_LIST; 查看源码 Collections.EMPTY_LIST new 了一个EmptyList,该类的继承关系如下图

继续深入源码,AbstractList.add方法会抛不支持的操作异常

 /**
     * {@inheritDoc}
     *
     * @implSpec
     * This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws ClassCastException            {@inheritDoc}
     * @throws NullPointerException          {@inheritDoc}
     * @throws IllegalArgumentException      {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

由于Arraylist实现了List接口,实现了add,Addall等其他方法,故添加时不会抛出该异常。

4.总结:

Collections.EMPTY_LIST 方法方法返回空list,可以防止空指针,但是前提时不会再对返回的list进行增加和删除操作,否则会抛异常。new ArrayList()创建时有初始大小,占用内存,emptyList()不用创建一个新的对象,可以减少内存开销;
 

分享到:

专栏

类型标签

外部链接

网站访问总量