ConcurrentModificationException异常出现的原因
Posted NHZ-M BLOG
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ConcurrentModificationException异常出现的原因相关的知识,希望对你有一定的参考价值。
原因:对list 、map 等迭代的时进行修改就会抛出java.util.ConcurrentModificationException异常
比如:
public synchronized void setSegmentStatus(NewNet seg, String msg) { if(segstatusmap.containsKey(msg)){ segstatusmap.get(msg).add(seg); }else{ List<NewNet> newNets = new ArrayList<NewNet>(); newNets.add(seg); segstatusmap.put(msg, newNets); } //更新网段当前执行状态,去除重复newnet if(msg.equals("正在检查")){ for(NewNet n:segstatusmap.get("未开始")){ if(seg.equals(n)){ segstatusmap.get("未开始").remove(n); } } for(NewNet n:segstatusmap.get("未开始")){ if(seg.equals(n)){ segstatusmap.get("未开始").remove(n); } } }else if(msg.equals("已完成")){ for(NewNet n:segstatusmap.get("未开始")){ if(seg.equals(n)){ segstatusmap.get("未开始").remove(n); } } for(NewNet n:segstatusmap.get("正在检查")){ if(seg.equals(n)){ segstatusmap.get("正在检查").remove(n); } } }
这段代码中 对 map :segstatusmap 遍历进行了remove操作, 报错如题。
解决方法:
1:临时变量list去解决
if(msg.equals("正在检查")){ ArrayList<NewNet> netList =new ArrayList<NewNet>(); for(NewNet n:segstatusmap.get("未开始")){ if(seg.equals(n)){ netList.add(n); } } for(NewNet n:netList){ netList.remove(n); } segstatusmap.get("未开始").clear(); for(NewNet n: netList){ segstatusmap.get("未开始").add(n); } }else if(msg.equals("已完成")){ ArrayList<NewNet> netList =new ArrayList<NewNet>(); for(NewNet n:segstatusmap.get("未开始")){ if(seg.equals(n)){ netList.add(n); } } for(NewNet n:netList){ netList.remove(n); } segstatusmap.get("未开始").clear(); for(NewNet n: netList){ segstatusmap.get("未开始").add(n); } ArrayList<NewNet> netList0 =new ArrayList<NewNet>(); for(NewNet n:segstatusmap.get("正在检查")){ if(seg.equals(n)){ netList0.add(n); } } for(NewNet n:netList0){ netList0.remove(n); } segstatusmap.get("正在检查").clear(); for(NewNet n: netList0){ segstatusmap.get("正在检查").add(n); } }
2:用Iterator 的remove()
以上是关于ConcurrentModificationException异常出现的原因的主要内容,如果未能解决你的问题,请参考以下文章