首页 后端 Java 正文

Arrays.asList使用报UnsupportedOperationException异常错误

   Arrays.asList使用报UnsupportedOperationException异常错误 // Demo  String[] nums = new String[]{"1","2","3"};  List<String> asList = Arrays.asList(nums);    ArrayList&l

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

Arrays.asList使用报UnsupportedOperationException异常错误  第1张

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

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

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

list:

Arrays.asList使用报UnsupportedOperationException异常错误  第2张

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

asList:

Arrays.asList使用报UnsupportedOperationException异常错误  第3张

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

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

Arrays.asList使用报UnsupportedOperationException异常错误  第4张

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

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

进入 AbstractList 定位到 addAll 方法:

Arrays.asList使用报UnsupportedOperationException异常错误  第5张

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

Arrays.asList使用报UnsupportedOperationException异常错误  第6张

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

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

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

原文:https://juejin.cn/post/7112743689503375373
打赏
海报

本文转载自互联网,旨在分享有价值的内容,文章如有侵权请联系删除,部分文章如未署名作者来源请联系我们及时备注,感谢您的支持。

转载请注明本文地址:https://www.shouxicto.com/article/6136.html

相关推荐

Java 入门:装箱与拆箱

在这篇文章中,我们将使用一些示例,来学习 Java 中的装箱与拆箱操作。原始数据类型的处理是不同的,因此引入了包装类,其中有两个组件起着作用,即自动装箱和解箱。...

Java 2022.08.03 0 89

Java中的抽象类与接口介绍

在Java中什么时候应该选择抽象类而不是接口?接受挑战吧!了解这些Java语言元素之间的区别以及如何在你的程序中使用它们。在Java代码中,甚至在Java开发工具包(JDK)本身中,都有大量的抽象类和...

Java 2022.08.02 0 103

发布评论

ainiaobaibaibaibaobaobeishangbishibizuichiguachijingchongjingdahaqiandaliandangaodw_dogedw_erhadw_miaodw_tuzidw_xiongmaodw_zhutouganbeigeiliguiguolaiguzhanghahahahashoushihaixiuhanheixianhenghorse2huaixiaohuatonghuaxinhufenjiayoujiyankeaikeliankouzhaokukuloukunkuxiaolandelinileimuliwulxhainiolxhlikelxhqiuguanzhulxhtouxiaolxhwahahalxhzanningwennonuokpinganqianqiaoqinqinquantouruoshayanshengbingshiwangshuaishuijiaosikaostar0star2star3taikaixintanshoutianpingtouxiaotuwabiweifengweiquweiwuweixiaowenhaowoshouwuxiangjixianhuaxiaoerbuyuxiaokuxiaoxinxinxinxinsuixixixuyeyinxianyinyueyouhenghengyuebingyueliangyunzanzhajizhongguozanzhoumazhuakuangzuohenghengzuoyi
支付宝
微信
赞助本站