张晨的个人博客

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

张晨的个人博客2014-09-25Java技术 9548 2A+A-

一、异常发生场景

场景发生在上传XML文件,上传成功后对这些文件进行解析操作,上传成功后会把相应的文件信息保存在Map集合中,然后后台根据这个Map进行解析XML文件,不管解析成功与否都会删除其在Map中的记录,以下是示例代码:

public class MapTest {

	public static void main(String[] args) {
		
		Map<Integer,String> map = new HashMap<Integer,String>(0);
		
		//创建Map
		for(int i = 0;i<5;i++){
			map.put(i, "测试Map"+i);
		}

		//使用Iterator迭代
		Iterator<Integer> i = map.keySet().iterator();
		
		while(i.hasNext()){
			Integer x = i.next();//进行第二轮的时候就会抛出异常
			System.out.println("需要删除的:"+map.get(x));
			map.remove(x);
		}
		
	}
}
 

二、发生原因

抛出ConcurrentModificationException异常的原因是一个线程在遍历这个容器一个线程却去修改这个容器,容器的迭代器检测到这样的行为就会抛出ConcurrentModificationException异常

三、解决办法

在遍历完时记录需要删除的值,遍历结束后再进行删除:

public class MapTest {

	public static void main(String[] args) {
		
		Map<Integer,String> map = new HashMap<Integer,String>(0);
		
		//创建Map
		for(int i = 0;i<5;i++){
			map.put(i, "测试Map"+i);
		}
		
		
		Iterator<Integer> i = map.keySet().iterator();//使用Iterator迭代
		
		List<Integer> list = new ArrayList<Integer>();
		
		while(i.hasNext()){
			Integer x = i.next();
			System.out.println("需要删除的:"+map.get(x));
			list.add(x);//记录需要删除
		}
		
		for(Integer li : list){//删除操作
			System.out.println("删除:"+map.get(li));
			map.remove(li);
		}
		
		System.out.println("删除后map长度为:"+map.size());
	}
}

发表评论