今天 遇到了一个bug,抛出的异常大致是下面这样的。
java.lang.UnsupportedOperationException: null
at java.util.AbstractList.add(AbstractList.java:148) ~[?:1.8.0_131]
at java.util.AbstractList.add(AbstractList.java:108) ~[?:1.8.0_131]
代码大致内容和下面这个差不多
public class test {
public static void main(String[] args) {
//定义一个字符长度为5的字符串
String[] strings = new String[5];
strings[0] = "a";
strings[1] = "b";
strings[2] = "c";
strings[3] = "d";
strings[4] = "e";
//调用Arrays中的asList方法将String[]转化为List<String>
List<String> list = Arrays.asList(strings);
System.out.println("list<String>:"+list.toString());
//为list添加一个元素
list.add("f");
System.out.println("list<String>:"+list.toString());
}
}
表面上看是没有什么问题的,我们在将数组转成List的时候也经常会这么做,但是执行这样的代码的时候还是报错了,这就很奇怪。
我们看一下上面的报错信息得知是在AbstractList.java:148位置报的错,我们找到对应的位置
调用这个方法时总是抛出异常。
我们在看一下这个位置AbstractList.java:108
都是英文看不懂,翻译翻译,看看说的是啥
哦 这里面让我们注意不重写这个add(int,e)方法的话就会抛出上面的异常。
问题其实是出在这一行
List<String> list = Arrays.asList(strings);
Arrays.asList(strings);方法返回的List对象不是我们常见的ArrayList,而是Arrays的一个内部类
让我们看一下这个内部类都有哪些方法
其中并没有重写add方法,所以在调用add方法的时候会执行父类的add方法(也就是上面我们截图的方法),这样报错的原因就找到了。
找到原因后,问题就好解决了,我们把返回的对象处理一下 转成我们熟悉的List实现类就可以了,
方法一:
List<String> list = new ArrayList<>(Arrays.asList(strings));
方法二:
List<String> list = new ArrayList<>(); list.addAll(Arrays.asList(strings));
搞定!