一、异常发生场景
场景发生在上传XML文件,上传成功后对这些文件进行解析操作,上传成功后会把相应的文件信息保存在Map集合中,然后后台根据这个Map进行解析XML文件,不管解析成功与否都会删除其在Map中的记录,以下是示例代码:
public class MapTest {
public static void main(String[] args) {
Map map = new HashMap(0);
//创建Map
for(int i = 0;i<5;i++){
map.put(i, "测试Map"+i);
}
//使用Iterator迭代
Iterator 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 map = new HashMap(0);
//创建Map
for(int i = 0;i<5;i++){
map.put(i, "测试Map"+i);
}
Iterator i = map.keySet().iterator();//使用Iterator迭代
List list = new ArrayList();
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());
}
}