有时会抛出java.util.ConcurrentModificationException
我正在执行下面的代码,但有时我得到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
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处理(没有真正研究您尝试执行的操作的逻辑;只是一个快速建议)。