今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

java.lang.UnsupportedOperationException

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()不用创建一个新的对象,可以减少内存开销;
 

分享到:

专栏

类型标签

网站访问总量