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