记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),如果子类没有重写,在调用时就会直接抛出异常。
在这里插入图片描述

发布了42 篇原创文章 · 获赞 29 · 访问量 2557

猜你喜欢

转载自blog.csdn.net/qq_32314335/article/details/85222104