项目场景:
某日在开发过程中,新建一个集合对象,写得好好地,居然报错了,报了个UnsupportedOperationException异常。
问题描述:
@Override
public void run() {
List<String> strs = Arrays.asList("111");
strs.add("123");
}
由Arrays.asList静态方法得到的数组使用add方法,报错,栈信息如下
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at cn.koala.JavaApplicationTests.ExceptionTest(JavaApplicationTests.java:106)
原因分析:
查看Arrays.asList方法
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
- 传进一个泛型,return新建的ArrayList,没毛病,再往里点
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);
}
- 看到这里就够了,ArrayList内部的a变量,是final类型的 ,传进泛型以后,return的ArrayList就是final的,对一个final的集合进行add操作,导致了这次报错。
解决方案:
如果非要用Arrays.asList()的出参作为一个新的集合,可以将其作为new ArrayList<>()的入参,如下
List<String> strs = new ArrayList<>(Arrays.asList("111"));
strs.add("123");
这样对strs进行操作是不会报错的