问题描述 今天在项目中调用List的add(…)方法时,程序报了java.lang.UnsupportedOperationException,这个List并非是List list = new ArrayList()
而来,而是用Arrays.asList(…)得到的:
List> list = Arrays.asList("test1", "test2", "test3");
list.add("test4");
运行结果:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at Main.main(Main.java:8)
【操作List报java.lang.UnsupportedOperationException】####原因分析
跟进到asList(…)方法的源码中:
public static List asList(T... a) {
return new ArrayList<>(a);
}
坑就在这里,它返回的这个ArrayList并不是
java.util.ArrayList
,而是java.util.Arrays
的内部类。文章图片
这两个ArrayList都继承自AbstractList,跟进到AbstractList里面看源码:
public E set(int index, E element) {
throw new UnsupportedOperationException();
}/**
* {@inheritDoc}
*
* This implementation always throws an
* {@code UnsupportedOperationException}.
*
* @throws UnsupportedOperationException {@inheritDoc}
* @throws ClassCastException{@inheritDoc}
* @throws NullPointerException{@inheritDoc}
* @throws IllegalArgumentException{@inheritDoc}
* @throws IndexOutOfBoundsException{@inheritDoc}
*/
public void add(int index, E element) {
throw new UnsupportedOperationException();
}/**
* {@inheritDoc}
*
* This implementation always throws an
* {@code UnsupportedOperationException}.
*
* @throws UnsupportedOperationException {@inheritDoc}
* @throws IndexOutOfBoundsException{@inheritDoc}
*/
public E remove(int index) {
throw new UnsupportedOperationException();
}
可以看出父类中的set,add,remove方法都是直接抛出
UnsupportedOperationException
,再回到Arrays的内部类ArrayList,并没有去重写上述方法,因此使用List.asList(..)
返回的Arrays内部类ArrayList对象进行add等操作时会抛此异常。再看java.util.ArrayList
中,都是对上诉方法进行了重写,因此通过new ArrayList()
得到的List进行add等操作,不会有问题。####解决方法
很简单:
List> list = new ArrayList<>(Arrays.asList("test1", "test2", "test3"));
list.add("test4");
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)