今天在使用res.addAll(ips)的时候突然抛出了这个异常,Debug查看res和ips这两个List也都没问题。

这个是堆栈

java.lang.UnsupportedOperationException: null
	at java.base/java.util.AbstractList.add(AbstractList.java:155)
	at java.base/java.util.AbstractList.add(AbstractList.java:113)
	at java.base/java.util.AbstractCollection.addAll(AbstractCollection.java:338)
	at com.wuqi.framework.web.service.SysPasswordService.lockLoginIp(SysPasswordService.java:101)

然后我偶尔看到我是将一个数组转换成list之后再去使用addAll的:

String[] split = config.getConfigValue().split(";");
// 转换成List
List<String> res = Arrays.asList(split);

问题就出在我转换这一步,由于我使用的是asList这个方法,我们查看一下它的源码:

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

由此可见,传来的元素会经过一个new ArrayList<>(a)然后返回,但是坑来了,这个ArrayList不是你我熟知的那个ArrayList,你我熟知那个是java.util包下的,但是这个方法返回的是java.util.Arrays.ArrayList。java.util.Arrays.ArrayList是Arrays类的一个内部私有静态类,它继承自AbstractList并实现了List接口,所以这么写IDEA也不会报错,但是当你使用List的add,remove等方法时由于它没有这个实现所以就会抛出:UnsupportedOperationException异常

解决办法也很简单,我们使用asList之后再使用一个new ArrayList接收即可:

List<String> res = new ArrayList<>(Arrays.asList(split));
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐