记Arrays.asList()踩坑后,分析源码

开发中,一次偶然的机会,就用到了这个方法,然后就莫名其妙报错了。

当时的场景是这样的,controller接受数组,service方法参数为list,就用Arrays.asList()转了一下。在service方法中,调用了这个list的remove方法,然后就报错了,异常信息都没打印出来,最后看日志,发现最有可能就是remove方法报异常了,然后就在本地写了个测试方法。
代码是这样的,就是移除list中已经存在于set中的值:
执行就报错了:

然后就用new出来的list试试,果然就成功了:

这样就可以确定问题就出在Arrays.asList这个方法里面了,看看这个方法的具体实现:
在这里插入图片描述
第一感觉就是,里面不也一样嘛,都是new ArrayList<>(),然后仔细看就有问题了,和外面new的还真就不一样呢。
在这里插入图片描述
原来这个Arraylist是Arrays里面的一个私有内部类,这个内部类是没有实现removeAll方法的,java.util.ArrayList是实现了removeAll方法的,所有它 没有问题。
在运行时,去调用removeAll方法,因为Arrays里面的ArrayList没有实现该方法所以就报错了。

AbstractList实现了List接口,这个类是一个骨架类,实现了部分方法(indexOf,clear),但是有的方法是必须子类去重写的(remove,set),如果子类没有重写,在调用时就会直接抛出异常。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值