一、错误分析


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 ArrayListArrayListArrays ArrayList和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); 
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐