【MedusaSTears】踩坑List.addAll抛出UnsupportedOperationException

转载标明出处: 公司内部博客,作者 居xx, 在此表示感谢


1、我自己遇到的问题

        try { // 不加try..catch报错 java.lang.UnsupportedOperationException: null ,原因未知
            list.addAll(a.getResult());
            list.addAll(b.getResult());
            list.addAll(c.getResult());
            list.addAll(d.getResult());
            list.addAll(e.getResult());
        } catch (Exception exception) {
            LOGGER.info2("get List<alarmVo> result error: {}", exception.getMessage());
        }

a~e这几个都是从数据库查询出来的PageResult类型的分页查询结果;
且他们List里面的vo类型是一模一样的

2、分析原因

  • 没踩过坑的同学可能看到这里没发现啥大问题,我们在将数组转成List的时候也经常会这么做,但是执行这段代码会抛出UnsupportedOperationException
    在这里插入图片描述
  • 看一下上面的报错信息得知是在AbstractList.java:148位置报的错,追溯一下代码
    在这里插入图片描述
  • 从注释里面我们读到,如果不重写这个add(int,e)方法的话就会抛出上面的异常。
  • 但是为啥为走到这个父类的方法,子类没有重写add方法?
  • 答案确实是没有重写,问题其实是出在这一行
    List<String> values = Arrays.asList(keys[1].split(","));
  • Arrays.asList(strings);方法返回的List对象不是我们常见的ArrayList,而是Arrays的一个内部类
    在这里插入图片描述
  • 让我们看一下这个内部类都有哪些方法
    在这里插入图片描述
  • 其中并没有重写add方法,所以在调用add方法的时候会执行父类的add方法(也就是上面我们截图的方法),这样报错的原因就找到了。

3、问题解决

找到原因后,问题就好解决了,我们把返回的对象处理一下 转成我们熟悉的List实现类就可以了
方法一:
List<String> list = new ArrayList<>(Arrays.asList(str));
方法二:

List<String> list = new ArrayList<>();
list.addAll(Arrays.asList(str));

搞定

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值