解决java.util.ConcurrentModificationException错误办法

这个异常一般在我们遍历删除集合元素时出现。写了下面这个代码来展示这个异常。

[java]
import java.util.ArrayList;
import java.util.List;

public class ExeptionTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");

for (String s : list) {
if ("c".equals(s)) {
list.remove("c");
}
}
}
}
[/java]

控制台报错如下:

[java]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at ExeptionTest.main(ExeptionTest.java:14)
[/java]

出现异常原因分析:
for循环执行时内部实际是调用的List实现了Iterator接口的方法,换句话说所有实现了Iterator接口的都可以使用for。追查JDK源码可以看到异常报错正是来自ArrayList内部实现的迭代器类Itr的checkForComodification()方法。

[java]
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
[/java]

其实这个方法只做了一件事就是检查迭代器当前的大小是否和原始大小一样,如果不一样。则认为原始的集合已经在其它地方被修改,故而出现此异常。

解决方法
既然报错的原因清楚了,那么我们只要不混用两种遍历方法就没有问题了。

[java]
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ExeptionTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");

// 法一
for (int i = 0; i < list.size(); i++) {
if (i == 2) {
list.remove(i);
}
}
System.out.println(list);

// 法二
Iterator iter = list.iterator();
while (iter.hasNext()) {
if ("d".equals(iter.next())) {
iter.remove();
}
}
System.out.println(list);
}
}

[/java]

ConcurrentModificationException进阶
某些时候我们可能会遇到遍历时还要再遍历删除的情况。这时该怎么解决呢?对于这样的情况我们有二种解决办法

将要删除的对象收集到另一个集合中一起删除[java]import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ExeptionTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");

Iterator iter = list.iterator();
List toBeRemove = new ArrayList();
String t = null;
while (iter.hasNext()) {
t = iter.next();
if (t.equals("c")) {
toBeRemove.add(t);
}
}
//使用removeAll一起删除
list.removeAll(toBeRemove);
System.out.println(list);

}
}[/java]

第一轮遍历时使用复制对象。[java]import java.util.ArrayList;
import java.util.List;
public class ExeptionTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
// 遍历复制集合,此时实际使用的是iterator.
for (String s : new ArrayList(list)) {
if (s.equals("c"))
//移除时使用的是非iterator的方式
list.remove(s);
}
System.out.println(list);
}
}
[/java]

本次的文章就写到这里,如有疏漏,欢迎指正。

时间: 2024-10-19 05:44:54

解决java.util.ConcurrentModificationException错误办法的相关文章

多线程 java.util.ConcurrentModificationException 问题

问题描述 目标:定义一个Producer类创建Student并添加到studnts集合中,再定义一个Consumer类从studnts集合中取出数据并打印控制台.Producer,Consumer类都实现了Runnable接口.在MainTest类的main方法中创建线程并启动,如下所示:        Producer p = new Producer();        Thread tp1 = new Thread(p);        tp1.start();              

出现 java.util.ConcurrentModificationException 时的解决办法

原文:http://www.cnblogs.com/error404/archive/2011/11/25/2263671.html for (int i=0; i<list.size(); i++) { // 只有在这种方式遍历集合时,同时对集合增加.删除才不会影响. // list.remove(list.get(i));   } 在对一个map进行迭代遍历并删除一些符合条件的键值对的时候,容易出现  java.util.ConcurrentModificationException 这个异

java.util.ConcurrentModificationException 解决方法_OpenStack

 java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 则使用会报以下异常: Java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793) at java.util.HashMap$Key

java.util.ConcurrentModificationException异常 解决方法

原文:http://blog.sina.com.cn/s/blog_48dc562301000d2b.html 今天写一个程序的时候遇到了java.util.ConcurrentModificationException异常,半天不知道是什么问题,这里举个简单的例子重现一下异常是如何出现的: import java.util.ArrayList; import java.util.Iterator; class User { private String userName, password;

【eclipse】 怎么解决java.lang.NoClassDefFoundError错误

前言 在日常Java开 发中,我们经常碰到java.lang.NoClassDefFoundError这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类 明明还在,为什么找不到?而且我们很容易把java.lang.NoClassDefFoundError和 java.lang.ClassNotfoundException这两个错误搞混,事实上这两个错误是完全不同的.我们往往花费时间去不断尝试一些其他 的方法去解决这个问题,而没有真正去理解这个错误的原因.这篇文章就是通过解决NoC

java.util.ConcurrentModificationException 已经百度过,折腾很久还是没想出来!!

问题描述 代码很简单 ,其实就是想测试一下iterator 的用法,而且我在用iterator遍历的时候也没有修改原来集合中的内容.import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class TestList {/** * @param args */public static void main(String[] args) {// TODO Auto-generated met

EMChatManager$4.run java.util.ConcurrentModificationException

问题描述 本帖最后由 truthone 于 2015-6-1 17:30 编辑 老是报出这个错误,是什么原因 解决方案 什么操作解决方案二:> forum.php?mod=redirect&goto=findpost&pid=3973&ptid=2039什么操作切换网络或者断网重连解决方案三:通过Iterator进行遍历的时候,如果直接对HashMap进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示其HashMap已经被修改

java.util.concurrent.ExecutionException 问题解决方法_java

java.util.concurrent.ExecutionException错误信息,这里给出解决方案,大家根据具体要求更改. SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standa

我的Android进阶之旅------&amp;gt;Android编译错误java.util.zip.ZipException: duplicate entry的解决方法

今天在Android Studio中把另外一个项目引入当前项目,编译的时候出现了java.util.zip.ZipException: duplicate entry错误. 错误如下所示: FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':watch:packageAllDebugClassesForMultiDex'. > java.util.zip.ZipExcept