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.ArraysArrayListArrayListArraysArrayList和ArrayList都是继承AbstractList,remove,add等method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(int),add(int)等,所以throw UnsupportedOperationException。

解决办法

和上面异常的处理一样,将引用操作转移到其他地方

 List list = Arrays.asList(fixArray[]);List newList = new ArrayList(list); 
1 0