发表评论
一、异常发生场景
场景发生在上传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()); } }