开发中想偷懒,稍有不慎就会出现问题,比如这个骚操作:
List<String> list = Arrays.asList("张三","李四");
list.add("王五");
异常如下:
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.example.demo.ClassTest.test2(ClassTest.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
为什么会这样呢,看下源码就很清楚了:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
Arrays.asList 方法会创建一个 ArrayList,注意 这个 ArrayList 是 Arrays 的内部类 ,不是 java.util 下的ArrayList.它继承了AbstractList 但是没有重写 AbstractList 的 add 方法.
而 AbstractList 的 add 方法是默认直接抛出 UnsupportedOperationException 的,它要求自己的子类自己重写add方法.所以这个问题就很清楚了.
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}