天天看点

Java记录java.lang.UnsupportedOperationException异常解决项目场景:问题描述:原因分析:解决方案:

项目场景:

某日在开发过程中,新建一个集合对象,写得好好地,居然报错了,报了个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进行操作是不会报错的