java容器 -- java.lang.UnsupportedOperationException
来源:互联网 发布:linux wget命令 404 编辑:程序博客网 时间:2024/06/05 00:27
一、错误分析
java.lang.UnsupportedOperationException 大致的意思是,你调用的关于的容器的操作是不被允许的。
注意【思想性的一些东西】:
1.这不是说没有该方法,如果没有该方法的话,在编译期间就可以识别。
2.有该方法,也就是说该方法受到了限制。
3.限制就类似于权限限制之类的东西。(类似于linux 中对于文件权限的管理)。如果list不能实现这种权限的限制,那么会存在一些安全性的问题。所以可以看出来,权限在大部分场合都是一个必备的成分。
4.不同的粒度上,相关的语言提供了不同控制权限的方式。
5.本质上,下面的错误案例,都可以归结为权限问题。
二、错误情况的举例1
Collections.unmodifiableList(*)引起的错误
下面这段代码会出现错误,抛出java.lang.UnsupportedOperationException.
- Collections.unmodifiableList 起到了对list**设置权限的目的**。
private static void testReadOnly(){ //1.创建一个list。并且这个list的访问权限未进行设置。 List<String> modifyList = new ArrayList<>(); //2.向其中插入相关的数据。【可行】 modifyList.add("you"); modifyList.add("are"); modifyList.add("boy"); //3.对list进行设置。使之可读。 modifyList = Collections.unmodifiableList(modifyList); //4.在次插入,出现错误。 modifyList.add("hello"); }
解决办法
1.该只读的权限维护的是,修改list中引用的权限。
2.但是如果你如果不改引用,是可以通过引用来更改其所指向的对象的。
private static void testChangeReadOnly(){ ////1.创建2个list。并且这2个list的访问权限未进行设置。 List<StringBuilder> modifyList = new ArrayList<>(); List<StringBuilder> normalList= new LinkedList<>(); //2.向modifylist中插入元素。 modifyList.add(new StringBuilder("you")); modifyList.add(new StringBuilder("are")); modifyList.add(new StringBuilder("boy")); //3.设置可读权限 modifyList = Collections.unmodifiableList(modifyList); //4.将只读的modifyList中的引用复制到normalList中。 normalList.addAll(modifyList); //5.向normalList中插入数据。 normalList.add(new StringBuilder("hello")); System.out.println(normalList.toString());//[you, are, boy, hello] //6.更改只读list中,引用所指向的对象的值。 System.out.println("更改之前 ----> " + modifyList.toString());//更改之前 ----> [you, are, boy] //更改 modifyList.get(1).append("~~~~~"); System.out.println("更改之后 ----> " + modifyList.toString());//更改之后 ----> [you, are~~~~~, boy] }
输出结果:
[you, are, boy, hello]更改之前 ----> [you, are, boy]更改之后 ----> [you, are~~~~~, boy]
三、错误情况的举例2
使用Arrays.asLisvt()后调用add,remove这些method时出现
原因:(摘自 :原文)
Arrays.asLisvt() 返回java.util.Arrays
解决办法
和上面异常的处理一样,将引用操作转移到其他地方。
List list = Arrays.asList(fixArray[]);List newList = new ArrayList(list);
- java容器 -- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException翻译
- java.lang.UnsupportedOperationException:错误
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException: createRequestComponentDeployer
- java.lang.UnsupportedOperationException异常
- 【转】java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException异常
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException
- java.lang.UnsupportedOperationException 解决方案
- java.lang.UnsupportedOperationException
- 异常java.lang.UnsupportedOperationException
- [LeetCode]--303. Range Sum Query - Immutable
- Halcon11与VS2010联合开发
- python实现:KL距离、jensen-shannon距离
- leetcode_387. First Unique Character in a String 找第一个非重复的字符下标,python字典的应用
- struts2中文乱码解决方法
- java容器 -- java.lang.UnsupportedOperationException
- 社会工程学(安全牛)
- 实现一个简单的类加载器
- STL中的二分查找——lower_bound 、upper_bound 、binary_search
- Storm/JStorm之Topology提交过程
- MQTT协议之使用Future模式订阅及发布(使用fusesource mqtt-client实现)
- Java结束线程的三种方法
- 复制二进制文件(图片、音频、视频)
- LintCode【入门】斐波纳契数列