Exception in thread “main” java.util.ConcurrentModificationException异常怎么解决?

ArrayList是java开发时非常常用的类,常碰到需要对ArrayList循环删除元素的情况。这时候大家都不会使用foreach循环的方式来遍历List,因为它会抛java.util.ConcurrentModificationException异常。 Vector也同样会报异常。比如下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.ArrayList;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;

public class ArrayListRemove {
public static void main(String[]args) {
List<String> list= new ArrayList<String>();
list.add("aa");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("c");
for(String s:list)
{
if(s.equals("b"))
{
list.remove(s);
}
}
System.out.println(list);
}
}

异常:

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- -的操作,否则会遗漏;
png

该索引指针将会遍历,删除集合中”test”元素,每删除一个元素,后一位元素将会向前补位,知道删除3索引位置后,4索引位置将向前补位,当这时索引指针将会向下查找,因此导致有个”test”元素遗漏,而删除后加个i- -可以有效防止这种情况

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Exception in thread “main” java.util.ConcurrentModificationException异常怎么解决?
    1. 1.0.0.1. ArrayList是java开发时非常常用的类,常碰到需要对ArrayList循环删除元素的情况。这时候大家都不会使用foreach循环的方式来遍历List,因为它会抛java.util.ConcurrentModificationException异常。 Vector也同样会报异常。比如下面的代码:
    2. 1.0.0.2. 解释:
    3. 1.0.0.3. *ps:当进行删除操作时,尤其是删除全部相同的元素时,需要在删除完成后加个i- -的操作,否则会遗漏;
,