Arrays.asList使用报UnsupportedOperationException异常错误

Arrays.asList使用报UnsupportedOperationException异常错误

Demo

String[] nums = new String[]{"1","2","3"};
List<String> asList = Arrays.asList(nums);

ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");

System.out.println(1);

list.addAll(asList);

System.out.println(2);

asList.addAll(list);  //运行至此处,报UnsupportedOperationException异常错误

System.out.println(3);

image-20220624135657138

起先我以为 asList 和 list 都是 List 类,那么 addAll 方法应该都是可行的。但是通过 asList 创建的 List 在运用 addAll 方法的时候却会抛 UnsupportedOperationException 的异常报错。

根据其字面意思判断是 不支持的操作 的异常。难道 asList 创建的 List 不支持 addAll 方法?

于是乎分别点击进入追踪 list 的 addAll 方法 和 asList 的 addAll 方法:

list:

在这里插入图片描述


可以发现此处 ArrayList 的 addAll 方法是进行了重写的。


asList:

在这里插入图片描述


而这里 asList 的 addAll 方法定位进去后发现定位到了接口中的 addAll 方法。

那就换个入口追踪,直接追踪 Arrays 的 asList 生成方法,试探性地研究一下:


在这里插入图片描述
噫,在 Arrays 类中竟然还有一个 同名为 ArrayList 的内部类,那么 asList 中新建的 ArrayList 应该就是这个内部类了,追踪一下,果然定位到了内部类中的构造方法了。


既然 asList 新建的是这个内部类,那就检查一下 addAll 方法吧,竟然没有重写 addAll 方法,那调用的就是 父类AbstractList 中的 addAll 方法了。

进入 AbstractList 定位到 addAll 方法:


image-20220624172526109


没有看到有抛出异常信息,那直接看主要的处理逻辑方法 add,定位进去:


image-20220624173023798


NICE!水落石出,原因嘛就是因为 Arrays 中 asList 生成的 Arraylist 内部类 没有完全重写 AbstractList 中对元素操作的方法,导致部分方法并不被继承类所支持。

经过这次的经验,那至少以后不会用 asList 生成的 List 再去调用 add、addAll 等未进行重写的方法了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值