文档章节

关于UnsupportedOperationException异常

hefeiuu
 hefeiuu
发布于 2017/05/04 20:28
字数 607
阅读 5
收藏 0
我们在使用collection框架code时,会时常遇到UnsupportedOperationException异常,有些人很不了解为什么抛出这个异常,会很郁闷,但是那些只知道code的代码工人不会想这些问题。下面我作一下解释,可能也不是很正确。

其实我们主要的疑惑可能是:java既然提供了这个方法,为什么我们调用要抛出异常,说不支持这个操作。我们先看一段代码:

List list1 = new ArrayList();
list1.add("test");

String[] array = new String[2];
List list2 = Arrays.asList(array);

List list3 = new ArrayList(list2);
list3.add("test");

array[0] = "test2";
System.out.println(list2.get(0));
list2.add("test");//抛出异常
在执行到l2.add("test")时抛出如下异常:

test2
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:151)
at java.util.AbstractList.add(AbstractList.java:89)
at TesException.main(TesException.java:20)

为什么会这样呢?

解释如下:

上面代码中list1是用正常方式下创建的List,可以增删内容

而list2是一个固定大小的List,不可以对其进行进行修改操作,对array的任何操作,若想修改list3的内容,只能通过修改其对应的array,从上面这一点也是可以看出的(关于这些解释可以参看api文档)。那么为什么会这样呢,其实List结构按是否可修改也是可以在分为两个类型的,但是collection框架已经有太多的接口类型了,若在对每种接口类型都分出一个unmodifiable类型的接口,那么最后collection框架会更大,对于学习与使用都会需要记住更多的接口。所以我想这样做的关键一点是:统一接口,减少开发人员的负担。但是若文档中没有对这一点说清楚,有些喜欢刨根问题的程序员会很郁闷。

我猜测Arrays.asList返回的List内容是Array的内容引用。若可以在List中修改,那么怎么同步呢?因为它们有一个本质的区别Array不能自动增大,若允许在List随便增大,则与其相应的Array的内容怎么保证不可修改呢?他们之间有一个阻抗。最后权衡一下,只能让Arrays.asList返回的List不可修改,或者让返回的List与Array之间没有关系,若这样的话,对于那些很大数组来说性能上就会很有影响。

本文转载自:http://ufopw.iteye.com/blog/1009150

共有 人打赏支持
hefeiuu
粉丝 3
博文 64
码字总数 0
作品 0
合肥
正确认识Arrays.asList方法

Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List 。 其源代码如下: 运行上述程序,输出如下内容。 心血来潮,突然想在创建的列表中添加一个字符串“Coo...

王孟君
2016/10/20
1K
11
运用@Transactional,自己抛出异常时不会回滚的原因,经验之谈

查看spring API可知 http://www.kuqin.com/spring2.0doc/index.html 对EJB来说,默认的行为是EJB容器在遇到系统异常 (通常指运行时异常)时自动回滚当前事务。EJB CMT遇到应用异常 (例如,...

孙斐
2011/12/04
0
0
Android AdapterView

前言   本章内容是android.widget.AdapterView,版本为Android 2.3 r1,翻译来自"cnmahj",欢迎大家访问他的博客:http://android.toolib.net/blog/,再次感谢"cnmahj"!欢迎你一起参与And...

amigos_wu
2012/06/12
0
0
有一个java笔记是什么体验?

1、UnsupportedOperationException 错误 java代码: 异常:UnsupportedOperationException 原因:Java Arrays未实现List的add和remove方法,所以调用的时候报错了。 解决方案:...

codingcloud
2016/11/22
15
0
Arrays.asList().removeAll()的问题

java list.removeAll() 问题   在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$Ar......

木子丰
2015/12/25
99
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash常用内置变量介绍

Bash常用内置变量介绍 Bash中有很多内置变量,这些变量不仅影响Bash的相关行为,也大大的方便了用户的常见操作。**Bash内置变量大体上包括两类,一类是传统Shell所具备的,另一类就是Bash所特...

小陶小陶
30分钟前
0
0
05-《深度拆解Java虚拟机》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
50分钟前
3
0
nginx统一入口 多服务出口

nginx配置多ip和端口统一调用入口log_format中$upstream_addr 标识打印转发的url地址配置upstream和locationhttp {include mime.types;default_type application/octet-stream...

GoldenVein
52分钟前
3
0
阿里P9架构师谈:高并发网站的监控系统选型、比较、核心监控指标

在高并发分布式环境下,对于访问量大的业务、接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况...

我是你大哥
54分钟前
2
0
华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!

还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线...

华为终端开放实验室
55分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部