一、异常产生
最近在一个坑上连续踩了两次,不开心,刨了下根,揪出了罪魁祸首,下面是异常信息:
下面我们情景再现一下,写了段测试代码:
@Test public void test() { People james = new People("James", 18); People skye = new People("Skye", 18); List<People> peoples = Arrays.asList(james); peoples.add(skye); System.out.println(peoples); }
代码很简单,就是使用 Arrays 这个工具类新建了一个 List,然后往里塞了点内容,就是调用 add 方法的时候报异常了,尴尬。
二、异常解决
很简单,他不给我使用 add 方法就不用呗,换个套路重走阳关道,使用最原始的 List 的 addAll 方法。
@Test public void test() { People james = new People("James", 18); People skye = new People("Skye", 18); List<People> peoples = new ArrayList<>(); peoples.addAll(Arrays.asList(james, skye)); System.out.println(peoples); }
三、异常分析
这个异常直译比较好理解,就是 不支持的操作,简言之就是通过 Arrays.asList 创建的集合,不支持 add 这种方法,好吧,下面是源码:
源码里边我们已经看到,返回的 List 是固定大小的,所以 任改变大小的操作,类似 add、remove 等都会报异常。
好奇心趋势我看了下返回的List 的类型:
Soga,原来工具类直接创建的是 Array$ArrayList。
那么异常是从哪报出来的呢?
其实你往里深究,像 ArrayList 等,都是继承自抽象类 AbstractList,在这个类里面我们率先找到了异常出处,好家伙,藏在这呢:
四、实用性
这也有实用性?好吧,我承认只是自己突然想到的一个点也许可以使用。
就是当我们需要一个 List,但是不允许修改其 size 咋办,此时可以自定义一个 类去扩展 AbstractList 不就好了,
至于日后想加上改变 size 的功能,可以另外在扩展类里面手动添加不就好了,
好吧,虽然这个点没什么用,但也是一种想法是吧。
文章评论