码迷,mamicode.com
首页 > 其他好文 > 详细

ConcurrentModificationException异常出现的原因

时间:2017-10-12 14:04:55      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:cep   ica   contain   去除   检查   color   新网   操作   etl   

  原因:对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异常出现的原因

标签:cep   ica   contain   去除   检查   color   新网   操作   etl   

原文地址:http://www.cnblogs.com/nhz-M/p/7655668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!