示例代码demo:
public static void main(String[] args) {
List<String> list = Arrays.asList("张三", "李四", "王五");
list.add("赵六");
}
运行结果:
可以发现直接抛出了异常。
接下来追踪下该异常抛出的原因,asList()方法返回的是一个ArrayList对象,如下:
看看ArrayList对象,如下:
发现ArrayList类是Arrays类下的一个静态类,不是平时常用的ArrayList类,二者是不同的,如下:
从异常截图来看,异常是调用add()方法后抛出来的,接下来看看这个ArrayList类所拥有的方法,如下:
没有一个add()方法,那么add()方法就是该类的父类提供的了,看看它的父类AbstractList类提供的add()方法,如下:
最后会调用到的add()方法会抛出上图截图中的异常,所以新增元素报异常根源找到了。
总结
从以上集合新增元素操作会抛出异常以及跟踪到的源码来看,通过asList()方法返回的是一个长度不可变的集合,数组多长,集合就是多长,所以除非集合是只读的,不然不建议用asList方法直接定义集合,毕竟如果把该集合对象发布出去,可能被影响的地方就多了。