Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有时会抛出java.util.ConcurrentModificationException_Java_Spring_Exception_Concurrency - Fatal编程技术网

有时会抛出java.util.ConcurrentModificationException

有时会抛出java.util.ConcurrentModificationException,java,spring,exception,concurrency,Java,Spring,Exception,Concurrency,我正在执行下面的代码,但有时我得到java.util.ConcurrentModificationException异常..但有时工作正常。请让我知道我在哪里做了错误的代码。下面是我的代码。如果有更好的方法,请检查我的逻辑,然后让我知道 public String saveSkills(HttpServletRequest request,@RequestParam String skills,@RequestParam String Email) throws IOException

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

    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);
    }
publicstringsaveskills(HttpServletRequest请求、@requestparamstringskills、@requestparamstringemail)抛出IOException
{
域domain1=(域)请求.getSession().getAttribute(“域”);
Long domanId=domain1.getDomainId();
系统输出打印(技能);
字符串[]skillsParts=skills.split(“,”);
UserProfile user=userProfileManager.getUserByEmail(domain1.getPrimary\u Domain\u Id(),Email);
if(user.getSkillsList().size()>0){
迭代器it=user.getSkillsList().Iterator();
while(it.hasNext())
{
skillsitereator=(Skills)it.next();
整数计数=0;

对于(int i=0;i这是来自JavaDoc for:

例如,如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将引发此异常

在最后一个循环中,您有时会这样做

user.getSkillsList().add(skillObj);

当使用
user.getSkillsList().iterator()迭代时
ConcurrentModificationException
在迭代过程中修改
集合
时会发生异常,而不是使用该方法

因此,执行时会抛出:

user.getSkillsList().add(skillObj);
在Java教程中:

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


堆栈跟踪将有助于您的意思是一个线程正在迭代集合,而另一个线程修改列表。我说的对吗?这是同一个线程在进行修改和迭代,因此不会导致Exception@NiksTyagi谢谢。@Octopus:不,相同的线程正在这里进行迭代和修改。当然,更多的线程可能会运行sa方法,但不需要产生此错误。好的。明白了--请注意,此异常并不总是表示对象已被其他线程并发修改。如果单个线程发出的方法调用序列违反了对象的约定,则该对象可能会引发此异常例如,如果线程在使用fail fast迭代器对集合进行迭代时直接修改集合,迭代器将引发此异常。创建另一个
列表
,并在迭代时向其添加元素。循环结束时,您可以根据需要对其进行处理。但该异常第二次出现。我创建了另一个循环并尝试了。但仍然有相同的例外情况,罪魁祸首是在迭代列表时不能修改列表。它是否是另一个循环并不重要,只要修改正在迭代的列表即可。不必添加到同一个列表中,您可以添加到新列表中,当退出循环时,将新列表中的所有元素添加到旧列表中。然后重新添加使用新元素对原始列表进行eat处理(没有真正研究您尝试执行的操作的逻辑;只是一个快速建议)。