背景是这样的,我在调用两个数据库查询方法.返回两个数组,数组里面每个元素都是int类型数据.需要对数组的数据进行交集处理,所以我就想当然去使用List.retainAll()方法.
首先需要将数组转成List.我这里使用了Arrays.asList()方法.
demo如下:
List<Integer> integerList = Arrays.asList(3, 3, 5, 6, 7);
List<Integer> integerList2 = Arrays.asList(3,5);
integerList.retainAll(integerList2);
System.out.println(integerList2);
test运行后报错:
Exception in thread "main" java.lang.UnsupportedOperationException: remove
at java.base/java.util.Iterator.remove(Iterator.java:102)
点击报错的行数查看抛出错误的代码:
default void remove() {
throw new UnsupportedOperationException("remove");
}
这个方法没有任何操作就直接抛出错误.
到这基本就毫无思路了,随即掏出百度大法,将报错信息一顿搜索,恍然大悟.
原来这个asList方法返回的实例类就不是java.util.ArrayList类,而是Arrays的内部类ArrayList.便开始debug.一看果然.
image.png
因为内部类没有去重写继承的remove()方法,会报错,而java.util.ArrayList类则重写了这个方法,所以不会报错.
找到问题了,自然就好解决了,将asList方法返回的List当做参数传入 java.util.ArrayList的构造方法,代码如下:
List<Integer> integerList = new ArrayList(Arrays.asList(3, 3, 5, 6, 7));
List<Integer> integerList2 = new ArrayList(Arrays.asList(3,5));
integerList.retainAll(integerList2);
System.out.println(integerList2);
问题解决.
总结
还是需要多看看java相关的api,源代码.认真debug,多踩坑,才能在以后避坑,还是需要不断的学习
网友评论