前言:昨天在进行字符串拆分时,使用了Arrays.asList()方法将数组转为了ArrayList集合,然后对这个集合使用了add()方法,结果抛出了UnsupportedOperationException异常。
今天来找一下原因并且记录一下踩坑经历。
话不多说,上图。
编写一个测试类:
还原我昨天的操作,我们直接跑一下看结果是不是返回 a,b,c,d
这里我们可以看出,抛出了UnsupportedOperationException异常
起初我并没有找到原因,因为前端传参可能为逗号分隔的多个参数(这里我用这个测试类模拟了一下)。参数可能为多个,我发现当参数为单个时并没有抛出这个异常,当参数为多个的时候就有这个异常,我们再用测试类模拟一下。
然后我们跑一下,看结果
结果并未抛出异常,证明问题出在 strList = Arrays.asList 这个地方,我们看一下asList做了什么,为什么会抛出这个异常。
我们点进去看一下这个ArrayList集合,和平时我们用的集合有什么不同
通过图片我们可以看到Array.asList()方法返回的并不是我们熟悉的ArrayList类,而是自己的一个内部类。
其实到这里已经离真相不远了,我们可以看到这个内部类继承了一个抽象类AbstractList,异常很有可能是这个AbstractList抛出的,我们点进去看一下。
这里它调用了另一个add方法,我们找一下。
总结:Arrays.asList()方法返回的并不是我们常用的ArrayList类,而是自己的一个内部类,这个内部类继承了一个叫AbstractList的抽象类,UnsupportedOperationException异常就来自于这个抽象类,也就是我们调用Arrays.asList()方法得到的ArrayList集合不能进行add操作(调用remove方法也会抛这个异常)。
好像我图片上有一个Arrays.asList()方法拼错了,写成了Array.asList(),希望大家不要介意,如果有说的不准确的地方,还希望各位大神给我指出来,万分感谢!以此记录一下这个坑,希望能帮到各位。