asList = Arrays.asList(nu">
首页>>后端>>java->Arrays.asList使用报UnsupportedOperationException异常错误

Arrays.asList使用报UnsupportedOperationException异常错误

时间:2023-12-07 本站 点击:0

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);

起先我以为 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 方法:

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

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

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

[借鉴]  https://blog.csdn.net/qq_33774822/article/details/83213947 

原文:https://juejin.cn/post/7112743689503375373


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/18723.html