文档章节

关于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
合肥
私信 提问
聊聊flink的Async I/O

序 本文主要研究一下flink的Async I/O 实例 本实例展示了flink Async I/O的基本用法,首先是实现AsyncFunction接口,用于编写异步请求逻辑及将结果或异常设置到resultFuture,然后就是使用A...

go4it
01/19
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 api 中文 (73)—— AdapterView

一、结构 public abstract class AdapterView extends ViewGroup java.lang.Object android.view.View android.view.ViewGroup android.widget.AdapterView 直接子类   AbsListView, AbsS......

walb呀
2017/12/05
0
0
有一个java笔记是什么体验?

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

codingcloud
2016/11/22
15
0

没有更多内容

加载失败,请刷新页面

加载更多

如何使用Hanlp加载大字典

问题 因为需要加载一个 近 1G 的字典到Hanlp中,一开始使用了CustomDictionay.add() 方法来一条条的加载,果然到了中间,维护DoubleArraTre 的成本太高,添加一个节点,都会很长时间,本来时...

左手的倒影
14分钟前
0
0
2018 年度新增开源软件排行榜之国产 TOP 50

2018 年开源中国社区「新增」开源软件排行榜之国产 TOP 50 终于发布了! 榜单根据 2018 年开源中国社区新收录的开源项目的关注度、活跃度,以及所属分类整理而来,相信在一定程度上反映了国内...

youfen
18分钟前
0
0
浅谈几种设计模式

Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为nul...

瑞查德-Jack
20分钟前
1
0
Time-wait状态(2MSL)一些理解

1. 编写TCP/SOCK 服务时,SO_REUSEADDR到底是什么意思? 这个套接字选项通知内核,如果端口忙,但TCP状态处于TIME_WAIT,可以重用端口。如果端口忙,TCP状态处于其他状态,重用端口时依旧指明...

Henrykin
26分钟前
0
0
数组处理

$arr = [ 0 => ['bid' => 1, 'money' => 1000, 'a' => 1, 'b' => 2, 'c' => 3], 1 => ['bid' => 1, 'money' => 1000, 'a' => 1, 'b' => 2, 'c' => 3],];$arr1 = [ ...

我才是张先生
35分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部