有时会抛出java.util.ConcurrentModificationException

时间:2014-01-30 11:49:52

标签: java spring exception concurrency

我执行下面的代码,但有时我得到java.util.ConcurrentModificationException异常..但有时工作正常。请让我知道我在哪里做错了code.Below是我的代码请检查我的逻辑,如果有更好的然后让我知道。

    public  String saveSkills(HttpServletRequest request,@RequestParam String skills,@RequestParam String Email) throws IOException
    {

        Domain domain1 = (Domain)request.getSession().getAttribute("Domain");
        Long domanId =domain1.getDomainId();
        System.out.println(skills);
        String[] skillsParts = skills.split(",");
        UserProfile user = userProfileManager.getUserByEmail(domain1.getPrimary_Domain_Id(), Email);
        if(user.getSkillsList().size()>0){
            Iterator it = user.getSkillsList().iterator();
            while (it.hasNext())
            {
                Skills skillsitereator = (Skills) it.next();
                int count=0;

                for(int i =0;i<skillsParts.length;i++){

                    if((skillsParts)[i].equals(skillsitereator.getSkillName())){

                        break;

                    }else{

                        count++;
                    }
                }
                if(count == skillsParts.length){
                    it.remove();
                    userProfileManager.update(user);
                }
            }
        }else{

            for(int i =0;i<skillsParts.length;i++){

                Skills skillObj = new Skills();
                skillObj.setSkillName(skillsParts[i]);
                user.getSkillsList().add(skillObj);

            }
            userProfileManager.update(user);
        }
        skillsParts = skills.split(",");
        System.out.println(skillsParts);
        ArrayList<Integer> values =new ArrayList<Integer>();
        for(int i =0;i<skillsParts.length;i++){
            Iterator it = user.getSkillsList().iterator();
            while (it.hasNext())
            {
                Skills skillsitereator = (Skills) it.next();
                if((skillsParts)[i].trim().equals(skillsitereator.getSkillName().trim())){
                    break;
                }
                else{

                    Skills skillObj = new Skills();
                    skillObj.setSkillName(skillsParts[i]);
                    user.getSkillsList().add(skillObj);
                    userProfileManager.update(user);
                }
            }
        }
        Gson gson = new Gson();
        return gson.toJson(user);
    }

2 个答案:

答案 0 :(得分:4)

这是来自ConcurrentModificationException的JavaDoc:

  

例如,如果一个线程在使用失败快速迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。

在你的上一轮循环中,你有时会这样做

user.getSkillsList().add(skillObj);

在使用user.getSkillsList().iterator()进行迭代时。

答案 1 :(得分:1)

除了使用Iterator.remove()方法之外,在迭代它时修改ConcurrentModificationException时会发生{p> Collection

因此,执行时会抛出它:

user.getSkillsList().add(skillObj);

来自Java教程,The Collection interface

  

请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。