java.lang.UnsupportedOperationException异常解决方法

一、 将数组转换成List,大家经常使用的方式是Arrays.asList,但是当使用转换后的List调用add()或者remove()方时抛出java.lang.UnsupportedOperationException异常,
为什么直接List strList= new ArrayList<>()调用add()或者remove()方时却可以正常操作,请看下文:

测试代码 复现

public class Test3 {
    public static void main(String[] args) {

        String[] strArray = {"1", "2", "3"};
        List<String> strList = Arrays.asList(strArray);

        try {
            strList.add("4");
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("strList : " + strList.toString());

        System.out.println("-----------------");

        List<String> strNewArrayList = new ArrayList<>();
        strNewArrayList.add("1");
        strNewArrayList.add("2");
        strNewArrayList.add("3");
        strNewArrayList.add("4");

        System.out.println("strNewArrayList:" + strNewArrayList);

    }

控制台打印结果:

在这里插入图片描述
可以看出strList.add(“4”)没有添加进来,抛出java.lang.UnsupportedOperationException异常,奇怪了,为什么strNewArrayList.add(“1”)…strNewArrayList.add(“4”)正常呢?

二、 问题分析:

Arrays.asList()源码如下:
在这里插入图片描述
asList() 方法直接 return new ArrayList<>(a);而这个 ArrayList;是Arrays类里的静态内部类,源码如下图:
在这里插入图片描述
从上面图片源码可以看出Arrays类里的静态内部类ArrayList是继承AbstractList,其构造函数需要传入数组参数,到这里我们知道Arrays.asList()是怎么将数组转换成List的了,重点来了,Arrays类里的静态内部类ArrayList是继承AbstractList,没有重写add()以及remove()方法,而是直接使用AbstractList类里的add()、remove()方法,源码如下:
在这里插入图片描述

从上面图片源码可以看出AbstractList类里面的add()方法直接抛出UnsupportedOperationException,到这里明白了Arrays.asList,但是当使用转换后的List调用add()或者remove()方时抛出java.lang.UnsupportedOperationException异常;

接下来看直接 new ArrayList<>(),ArrayList类也是继承AbstractList,不同的是ArrayList重写add()、remove()方法,源码如下:
在这里插入图片描述
从上面图片源码可以看出ArrayList类里的重写add()方法做了不同逻辑处理;

下面是修改后的代码,解决UnsupportedOperationException异常:
在这里插入图片描述

三、 总结

将数组通过Arrays.asList转化为List的时候,是不能对转化出来的结果进行add,remove操作的,因为它是Arrays里面的静态内部类ArrayList,它继承AbstractList,没有重写AbstractList里的add()、remove()方法,而AbstractList里的add()、remove()方法直接抛出UnsupportedOperationException异常;
而直接 new ArrayList<>()是java.util.ArrayList,ArrayList也是继承AbstractList,但是它重写add()、remove()方法并且做了相关逻辑处理

解决UnsupportedOperationException异常方法是:将数组通过Arrays.asList转化为List传入new ArrayList<>()里得到新的List, 然后用新的List进行add()、remove()操作。

欢迎关注我的公众号,不定期推送优质的文章,
微信扫一扫下方二维码即可关注。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值