java.util.ConcurrentModificationException的解决办法

  今天在使用iterator.hasNext()操作迭代器的时候,当迭代的对象发生改变,比如插入了新数据,或者有数据被删除。

编译器报出了以下异常:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
	at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:752)
	at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:750)
	at DBOperating.norStaticRelations(DBOperating.java:88)
	at DBOperating.insertintoDB(DBOperating.java:79)
	at Main.main(Main.java:51)

 例如以下程序:

import java.util.*;  

public class Main
{
public static void main(String args[])
{
Main main = new Main();
main.test();
}  

public void test()
{
Map aa = new HashMap();
a.put("1", "111");
aa.put("2", "222");
Iterator it = aa.keySet().iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
            aa.remove(ele);    //此处报错
}
System.out.println("运行成功!");
}
}

  

分析原因:Iterator做遍历的时候,HashMap被修改(aa.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。

解决办法:

1) 通过Iterator修改Hashtable
while(it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
            it.remove();
}

2) 根据实际程序,您自己手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。

3) 使用“ConcurrentHashMap”替换HashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。

 

时间: 2025-01-02 04:44:15

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

java.util.ConcurrentModificationException 异常解决办法及原理

最近在修程序的bug,发现后台抛出以下异常: Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793) at java.util.HashMap$KeyIterator.next(HashMap.java:828) at com.keyman.demo.test.ClearResult

java.util.ConcurrentModificationException 解决办法

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

java.util.ConcurrentModificationException异常原因及解决方法

在java语言中,ArrayList是一个很常用的类,在编程中经常要对ArrayList进行删除操作,在使用remove方法对ArrayList进行删除操作时,报java.util.ConcurrentModificationException异常,下面探讨一下该异常的原因以及解决办法. 1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class Test { 5 6 public static void mai

java.util.ConcurrentModificationException 解决 Android

java.util.ConcurrentModificationException 解决       Android  java 在项目里面 遇到了这个bug : E/AndroidRuntime(22055): java.util.ConcurrentModificationException E/AndroidRuntime(22055):      at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 查看了下

ConcurrentModificationException异常解决办法

今天在写一个带缓存功能的访问代理程序时出现了java.util.ConcurrentModificationException异常, 因为该异常是非捕获型异常而且很少见,所以费了些时间才找到问题所在,原来在通过Iterator进行遍历的时候,如果直接对HashMap进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示其HashMap已经被修改. 源程序代码片段如下:caches为一个HashMap对象 1 String sameKeyPart = accesserClassN

list删除操作 java.util.ConcurrentModificationException

首先大家先看一段代码: public static void main(String[] args) { List<String> listStr = new ArrayList<String>();      listStr.add("1");      listStr.add("2");      listStr.add("3");      listStr.add("4");      listS

Java.util.ConcurrentModificationException的理解与修改

在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" java.util.ConcurrentModificationException, 下面介绍异常原因以及这种异常的改进方法,内容很简单,有什么问题还望指正. 假设我们要实现这样一个例子: 判断集合里面有没有"world"这个元素,如果有,就添加一个"javaee"元素 出现异常的代码如下: import java.util.ArrayList;

小小异常:java.util.ConcurrentModificationException

1 public static void main(String[] args) { 2 ArrayList<String> list = new ArrayList<String>(); 3 for(int i = 0; i < 5; i++){ 4 list.add("str"+i); 5 } 6 for(String item:list){ 7 if("str2".equals(item)){ 8 list.remove(&quo

Maven项目下 java.lang.ClassNotFoundException 常规解决办法

网上很多要修改.class .project的比较麻烦有时候还不一定管用.下面的方法适合于项目用已经引用了jar,但是运行时却ClassNotFound,请用如下方法试试: 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web