0

我有一个网格,用户从中选择行,当单击一行时,它的 id 将发送到我的操作类AddBookToSession.java,然后将列表返回到我的 jsp 页面invoice.jsp

java.util.ConcurrentModificationException当用户从我的网格中选择一行时, 我收到错误。

我读了这个类似的问题,但我仍然无法解决我的问题。

我的问题是:为什么我收到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)
       -------------------
        ------------------

发票.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;
    } 
4

3 回答 3

0

从根本上说,您正在修改一个对象,而其他一些对象取决于第一个对象的状态以保持不变。

当在某种集合对象上使用非修改安全的迭代器,然后修改集合时,这种情况最常见。

我的 JSP 太生疏了,无法浏览您的源代码,但我看到一些您似乎在使用迭代器的情况,而您的 JSP 中的那个看起来最可疑。

(我相信当您使用多线程以非线程安全的方式管理集合对象时也会发生此错误。)

于 2012-12-10T18:49:15.753 回答
0

页面可能在您的代码执行“books.add(book);”时刷新。在这种情况下,您将在其他人使用它的同时修改集合时遇到异常。

是否可以修改您的代码,以便您在 AddBookToSession 中修改的“书籍”是内部书籍列表的副本。

books = new ArrayList<Bookdetails>((ArrayList) session.get(BillTransactionBooksConstants.BOK););
于 2012-12-10T18:55:52.167 回答
0

异常堆栈跟踪指向s:iterator您的 jsp 中抛出异常的位置。这意味着,当该元素遍历图书列表时,另一段代码会从列表中添加或删除。这可能是您的 Java 代码,或其他一些代码(例如RemovebooksFromSession)。

查看您的代码并尝试确定是否有可能在构建您的 jsp 页面时运行其他代码。

您发布的代码无法为您提供更多帮助。

于 2012-12-11T08:08:38.230 回答