Exception in thread “main” java.util.ConcurrentModificationException异常怎么解决?
ArrayList是java开发时非常常用的类,常碰到需要对ArrayList循环删除元素的情况。这时候大家都不会使用foreach循环的方式来遍历List,因为它会抛java.util.ConcurrentModificationException异常。 Vector也同样会报异常。比如下面的代码:
1 | import java.util.ArrayList; |
异常:
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.Vector$Itr.checkForComodification(Vector.java:1210)
at java.util.Vector$Itr.next(Vector.java:1163)
at com.carry.demo.ArrayListRemove.main(ArrayListRemove.java:17)
解释:
首先java的foreach循环其实就是根据list对象创建一个Iterator迭代对象,用这个迭代对象来遍历list,相当于list对象中元素的遍历托管给了Iterator,你如果要对list进行增删操作,都必须经过Iterator。iterator创建的时候modCount被赋值给了expectedModCount,但是调用list的add和remove方法的时候不会同时自动增减expectedModCount,这样就导致两个count不相等,从而抛出异常。
*ps:当进行删除操作时,尤其是删除全部相同的元素时,需要在删除完成后加个i- -的操作,否则会遗漏;
该索引指针将会遍历,删除集合中”test”元素,每删除一个元素,后一位元素将会向前补位,知道删除3索引位置后,4索引位置将向前补位,当这时索引指针将会向下查找,因此导致有个”test”元素遗漏,而删除后加个i- -可以有效防止这种情况;