最近项目中遇到了一个坑,项目启动没问题,一直正常运行,有一次报了莫名其妙的错误:
Exception in thread “main” java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at arraylist.Test.main(Test.java:9)
简化后的代码如下:
package arraylist;
import java.util.*;
public class Test {
public static void main(String[] args) {
String[] strArray = {"a", "b", "c"};
List<String> strList = Arrays.asList(strArray);
strList.add("d");
System.out.println(strList.size());
}
}
代码中需要将数组转成list之后,再执行add操作,结果报错了。这个地方隐藏得有点深,在编译阶段不会报错,调用的时候才会出现这个错误。
首先看下Arrays.asList()方法的源码,在注释中可以看到这是一个 固定尺寸的List。但是返回的明明是ArrayList对象,为什么不支持大小可变的add或者remove操作呢?
再看看这里的ArrayList类:
原来这里并不是我们常用的ArrayList,而是private定义的一个内部类,只是名字也叫 ArrayList 而已,通过查看源码,这个类里面并没有add、remove等方法。
至此问题终于找到了,此ArrayList非彼ArrayList。
数组转list,如果需要add、remove等操作的话,可以参考下面的写法:
List<String> strList = new ArrayList<>(Arrays.asList(strArray));
原来的代码正确修改如下:
package arraylist;
import java.util.*;
public class Test {
public static void main(String[] args) {
String[] strArray = {"a", "b", "c"};
List<String> strList = new ArrayList<>(Arrays.asList(strArray));
strList.add("d");
System.out.println(strList.size());
}
}
运行结果正常:
4
Process finished with exit code 0