示例:
public class ArraysTest {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3,4,5);
list.add(6);//UnsupportedOperationException
list.forEach(System.out::println);
}
}
运行结果:
其实早在阿里巴巴Java开发规范手册中就有写到:在使用工具类Arrays.asList()
方法把数组转换为集合时,不能使用其相关修改集合的方法,如add/remove/clear
方法都会抛出UnsupportedOperationException异常;那么为什么会出现这种异常呢?
场景分析:
我们可以查看下Arrays源码中的asList()
方法,可以发现asList()
内部new了一个新的ArrayList,但是这个ArrayList不是我们日常使用的ArrayList,而是Arrays内部继承自AbstractList的一个私有静态内部类,当我们调用其中的add/remove/clear
方法时,会调用AbstractList内部的add/remove/clear
方法,从而导致抛出UnsupportedOperationException异常。
Arrays源码:
AbstractList源码:
解决方案:
那如果我们使用了Arrays.asList非要使用集合的操作方法呢,有什么办法能够避免吗,当然有,而且非常简单,我们只需要在外面再包一层真正的ArrayList就可以了,代码如下,运行起来也能够看到,如我们所预料的执行了代码。
public class ArraysTest {
public static void main(String[] args) {
// List<Integer> list = Arrays.asList(1,2,3,4,5);//UnsupportedOperationException
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
list.add(6);
list.forEach(System.out::println);
}
}