2014-01-30 3 views
2

내가 아래의 코드를 실행하지만 일부 시간 내가 java.util.ConcurrentModificationException 예외를 가지고 ..하지만 일부 시간 fine.please 일하고 내가 어디 코드를 잘못했는지 알려주지. 내 코드는 확인하시기 바랍니다 내 논리는 또한 더 좋은 방법이 있다면 알려주세요.몇 번에 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); 
    } 
+2

스택 추적은 도움이 될 것입니다. – user1428716

답변

4

ConcurrentModificationException를위한 JavaDoc에서입니다 : 예를 들어

, thread가 컬렉션을 직접 수정하는 경우가 르파 반복자를 가지는 컬렉션의 반복하면서, 반복자가 발생합니다 이 예외. 반복하는이 user.getSkillsList().iterator()를 사용하는 동안 마지막 루프에서

, 당신은 때때로

user.getSkillsList().add(skillObj); 

을한다.

+0

한 스레드가 컬렉션을 반복하고 다른 스레드가 목록을 수정한다는 것을 의미합니다. 내가 맞습니까? – Keerthivasan

+0

mod와 iteration을 수행하는 동일한 스레드가 예외를 발생시키지 않도록합니다. – user1428716

+0

@Octopus correct – Kick

1

ConcurrentModificationExceptionIterator.remove() 메서드를 사용하는 대신 Collection을 반복하면서 수정하는 경우 발생합니다. 자바 튜토리얼에서

user.getSkillsList().add(skillObj); 

, The Collection interface : 실행시

그래서, 그것은 발생합니다는, Iterator.remove이 반복하는 동안 컬렉션을 수정할 수있는 유일한 안전한 방법이라고

참고; 반복이 진행되는 동안 기본 컬렉션이 다른 방법으로 수정되면 비헤이비어가 지정되지 않습니다.

+0

어떻게 해결할 수 있습니까? –

+0

다른 'List'를 만들고 반복하면서 요소를 추가하십시오. 루프가 끝날 때 적합하게 처리 할 수 ​​있습니다. –

+0

하지만 그 예외는 두 번째입니다. 나는 또 다른 루프를 만들었고 시도했습니다.하지만 여전히 동일한 예외가 발생했습니다. –

관련 문제