2012-12-10 2 views
0

내가 행을 클릭 한 다음 해당 ID가 내 작업 클래스 AddBookToSession.java으로 전송 될 때 사용자가 행을 선택하는 곳의 그리드가 있고 병동이 내 JSP 페이지에 목록을 반환하는 경우 invoice.jspError : java.util.ConcurrentModificationException

사용자가 그리드에서 행을 선택할 때 java.util.ConcurrentModificationException 오류가 발생합니다.

나는이 similar question을 읽었지만 여전히 내 문제를 해결할 수 없다.

내 문제는 다음과 같습니다. 이유가 무엇입니까? java.util.ConcurrentModificationException 오류 및이 문제를 어떻게 해결할 수 있습니까? 이 문제를 해결하도록 도와주세요. 콘솔

오류 :

Dec 10, 2012 11:37:30 PM org.apache.catalina.core.ApplicationDispatcher invoke 
    SEVERE: Servlet.service() for servlet jsp threw exception 
    java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819) 
    at java.util.ArrayList$Itr.next(ArrayList.java:791) 
    at org.apache.struts2.components.IteratorComponent.end(IteratorComponent.java:334) 
    at org.apache.struts2.views.jsp.IteratorTag.doAfterBody(IteratorTag.java:87) 
     ------------------- 
     ------------------ 

invoice.jsp

<s:if test="#session['BOK'].size() > 0"> 
     <table width="100%" class="userTable" valign="top" border="0"> 
      <s:iterator value="#session.BOK" status="userStatus"> 
     <tr class="<s:if test="%{#userStatus.odd == true}">odd</s:if> <s:else>even</s:else>"> 
      <td width="80%"><s:property value="bookTitile" /></td> 
       <td align="right" width="20%"> 
       <s:url id="cancelURL" action="RemovebooksFromSession" namespace="/admin/setups/secure/jspHomepage/bookstransaction"> 
         <s:param name="bkid" value="%{id}"></s:param> 
        </s:url> 
       <sj:a href="%{cancelURL}" targets="myAdvanceDivBoxx">Rem</sj:a></td> 
     </tr> 
     </s:iterator> 
     </table> 
     </div> 
    </s:if> 

AddBookToSession.java

public String execute() 
    { 
     String bookid = request.getParameter("bid"); 
     String qnty=dao.getquantityById(Integer.parseInt(bookid)); 

     if(qnty.equals("0")||qnty.equals("")||qnty.equals("null")){ 
      return SUCCESS; 
     } 
     Bookdetails book = dao.listBookDetailsById(Integer.parseInt(bookid)); 
     books = (ArrayList) session.get(BillTransactionBooksConstants.BOK); 
     if (books == null) books = new ArrayList<Bookdetails>(); 
     boolean already_exists = false; 
     for (Bookdetails b : books) 
     { 
       if (Integer.toString(b.getId()).equals(bookid)) 
      { 
       already_exists = true; 
       break; 
      } 
     } 
     if (book != null && !already_exists ) 
     { 
      books.add(book); 
      System.out.println("books size"+books.size()); 
      session.put(BillTransactionBooksConstants.BOK,books); 
     } 
     return SUCCESS; 
    } 
+0

JSP가 세션의 목록에서 책을 제거하는 것처럼 보입니다. 올바른 JSP 코드를 보여주고 있습니까? 또한 stacktrace를 더 게시해야합니다 (예 : 현재 JSP 이름이 누락되었습니다. –

+0

@BheshGurung 그것이 올바른 jsp입니다. 세션에서 내가 추가 한 목록은 여기에서 반복됩니다. 나는 목록에서 제거 할 링크 삭제 북을주었습니다. –

답변

0

예외 스택 추적 점. 즉, 해당 요소가 장부 목록을 통과하는 동안 다른 부분의 코드가 목록에 추가되거나 제거됩니다. 자바 코드 일 수도 있고 다른 코드 일 수도 있습니다 (예 : RemovebooksFromSession).

코드를 살펴보고 jsp 페이지를 빌드하는 동안 다른 코드가 실행될 수 있는지 확인하십시오.

게시 한 코드로 더 많은 도움을받을 수 없습니다.

+0

예, 맞습니다. 나는 그것을 지금 검사 할 것이다 –

+0

문제는 당신이 말한 것과 같았다. 같은 목록이 두 가지 기능을 함께 수행하고있었습니다. 즉 사용자는 목록이 반복되고 같은 페이지에 표시되는 동시에 목록에 요소를 추가합니다. 목록에 completly 표시되지 않은 경우 사용자가 추가 할 수있는 솔루션에 대한 새로운 가치를 추가 할 수 없습니다. –

0

Fundamentall y, 다른 개체가 첫 번째 개체의 상태에 따라 변하지 않고 개체를 수정하는 중입니다.

이는 일종의 컬렉션 개체에서 수정이 불가능한 반복기를 사용한 다음 컬렉션을 수정할 때 자주 발생합니다.

내 JSP가 소스 코드를 녹이기에는 너무 녹슬지 만, 반복기를 사용하는 것처럼 보이고 JSP에서 가장 의심스러운 것으로 보이는 경우가 두 가지 있습니다.

은 (난 당신이 비 스레드 안전 방식으로 수집 개체를 관리하는 멀티 스레딩을 사용하는 경우이 오류가 발생할 수 있다고 생각합니다.)

+0

제 질문과 비슷한 해결책으로 설명해 주시겠습니까? –

+0

@AshutoshSingh - ArrayList를 수정하는 곳 (불만 사항)을 살펴보십시오. ArrayList를 반복하는 동안 그렇게하는지보십시오. 내 생각 엔 "RemovebooksFromSession"은 유죄 당사자입니다. –

+0

@AshutoshSingh - 힌트 : 실제로 * 예외 추적에보세요 *! –

0

이 페이지가 코드가 실행 시간의 주위에 새로 고칠 가능성이있다 "books.add (책);" 이 경우 다른 사람이 컬렉션을 사용하는 것과 동시에 컬렉션을 수정할 때 예외가 발생합니다.

AddBookToSession에서 수정 한 "서적"이 내부 목록 목록의 복사본이되도록 코드를 수정할 수 있습니까? 예외가 발생하는 장소 인 당신의 JSP에서 s:iterator

books = new ArrayList<Bookdetails>((ArrayList) session.get(BillTransactionBooksConstants.BOK);); 
+0

아니요.이 코드를 적용하면 작동이 중지됩니다. 나는 시험했다. –