java容器 -- java.lang.UnsupportedOperationException

一、错误分析


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); 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java.lang.UnsupportedOperationException是一个运行时异常,表示不支持的操作。在你提供的引用\[1\]中,异常是在对一个List进行remove操作时抛出的。这个异常的原因是因为你使用的是Arrays.asList()方法返回的Arrays$ArrayList,而不是普通的ArrayList。Arrays$ArrayList是继承自AbstractList的,而AbstractList中的remove方法默认会抛出UnsupportedOperationException异常。而普通的ArrayList会覆盖这些方法来对List进行操作。所以当你尝试在Arrays$ArrayList上调用remove方法时,就会抛出UnsupportedOperationException异常。\[2\] 要解决这个问题,你可以使用普通的ArrayList来替代Arrays$ArrayList。或者,你可以使用Collections.unmodifiableList方法来对List进行设置权限,这样就不会抛出UnsupportedOperationException异常。\[3\] #### 引用[.reference_title] - *1* [java.lang.UnsupportedOperationException 异常的解决方法及相关原因](https://blog.csdn.net/weixin_43228155/article/details/122866078)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [java容器 -- java.lang.UnsupportedOperationException](https://blog.csdn.net/TheSnowBoy_2/article/details/52831118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值