Java异常之:UnsupportedOperationException

一、异常产生

最近在一个坑上连续踩了两次,不开心,刨了下根,揪出了罪魁祸首,下面是异常信息:

bugUnsupportOperation.png

下面我们情景再现一下,写了段测试代码:</p>

1
2
3
4
5
6
7
8
@Test
public&nbsp;void&nbsp;test()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;People&nbsp;james&nbsp;=&nbsp;new&nbsp;People("James",&nbsp;18);
&nbsp;&nbsp;&nbsp;&nbsp;People&nbsp;skye&nbsp;=&nbsp;new&nbsp;People("Skye",&nbsp;18);
&nbsp;&nbsp;&nbsp;&nbsp;List<People>&nbsp;peoples&nbsp;=&nbsp;Arrays.asList(james);
&nbsp;&nbsp;&nbsp;&nbsp;peoples.add(skye);
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(peoples);
}

代码很简单,就是使用 Arrays 这个工具类新建了一个 List,然后往里塞了点内容,就是调用 add 方法的时候报异常了,尴尬。

二、异常解决

很简单,他不给我使用 add 方法就不用呗,换个套路重走阳关道,使用最原始的 List 的 addAll 方法。

1
2
3
4
5
6
7
8
@Test
public&nbsp;void&nbsp;test()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;People&nbsp;james&nbsp;=&nbsp;new&nbsp;People("James",&nbsp;18);
&nbsp;&nbsp;&nbsp;&nbsp;People&nbsp;skye&nbsp;=&nbsp;new&nbsp;People("Skye",&nbsp;18);
&nbsp;&nbsp;&nbsp;&nbsp;List<People>&nbsp;peoples&nbsp;=&nbsp;new&nbsp;ArrayList<>();
&nbsp;&nbsp;&nbsp;&nbsp;peoples.addAll(Arrays.asList(james,&nbsp;skye));
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(peoples);
}

三、异常分析

这个异常直译比较好理解,就是 不支持的操作,简言之就是通过 Arrays.asList 创建的集合,不支持 add 这种方法,好吧,下面是源码:

bugUnsupportOperation02.png

源码里边我们已经看到,返回的 List 是固定大小的,所以 任改变大小的操作,类似 add、remove 等都会报异常。

好奇心趋势我看了下返回的List 的类型:

bugUnsupportOperation03.png

Soga,原来工具类直接创建的是 Array$ArrayList。

那么异常是从哪报出来的呢?

其实你往里深究,像 ArrayList 等,都是继承自抽象类 AbstractList,在这个类里面我们率先找到了异常出处,好家伙,藏在这呢:

bugUnsupportOperation04.png

四、实用性

这也有实用性?好吧,我承认只是自己突然想到的一个点也许可以使用。

就是当我们需要一个 List,但是不允许修改其 size 咋办,此时可以自定义一个 类去扩展 AbstractList 不就好了,

至于日后想加上改变 size 的功能,可以另外在扩展类里面手动添加不就好了,

好吧,虽然这个点没什么用,但也是一种想法是吧。





------ 本文结束 感谢阅读 ------
0%