开发中遇到的坑——用Arrays.asList将数组转成list,调用用add()方法报错Exception in thread “main“ java.lang.UnsupportedOperati

最近项目中遇到了一个坑,项目启动没问题,一直正常运行,有一次报了莫名其妙的错误:
Exception in thread “main” java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at arraylist.Test.main(Test.java:9)

简化后的代码如下:

package arraylist;

import java.util.*;

public class Test {
   public static void main(String[] args) {
      String[] strArray = {"a", "b", "c"};
      List<String> strList = Arrays.asList(strArray);
      strList.add("d");
      System.out.println(strList.size());
   }
}

代码中需要将数组转成list之后,再执行add操作,结果报错了。这个地方隐藏得有点深,在编译阶段不会报错,调用的时候才会出现这个错误。

首先看下Arrays.asList()方法的源码,在注释中可以看到这是一个 固定尺寸的List。但是返回的明明是ArrayList对象,为什么不支持大小可变的add或者remove操作呢?
在这里插入图片描述
再看看这里的ArrayList类:
在这里插入图片描述
原来这里并不是我们常用的ArrayList,而是private定义的一个内部类,只是名字也叫 ArrayList 而已,通过查看源码,这个类里面并没有add、remove等方法。

至此问题终于找到了,此ArrayList非彼ArrayList。

数组转list,如果需要add、remove等操作的话,可以参考下面的写法:

List<String> strList = new ArrayList<>(Arrays.asList(strArray));

原来的代码正确修改如下:

package arraylist;

import java.util.*;

public class Test {
   public static void main(String[] args) {
      String[] strArray = {"a", "b", "c"};
      List<String> strList = new ArrayList<>(Arrays.asList(strArray));
      strList.add("d");
      System.out.println(strList.size());

   }
}

运行结果正常:

4

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值