【问题标题】:Error : java.util.ConcurrentModificationException错误:java.util.ConcurrentModificationException
【发布时间】:2012-11-28 05:29:37
【问题描述】:

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

当用户从我的网格中选择一行时,我收到错误 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;
    } 

【问题讨论】:

  • 那个 JSP 看起来像是从会话列表中删除书籍的那个。您确定您显示的是正确的 JSP 代码吗?此外,您应该发布更多的堆栈跟踪,例如目前它缺少 JSP 名称。
  • @BheshGurung 这是正确的jsp。我在会话中添加的列表在这里迭代。我给了一个链接 removebook 从列表中删除。

标签: java list struts2 concurrentmodification foreach


【解决方案1】:

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

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

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

【讨论】:

  • 问题和你说的一样。同一个列表同时执行两个功能。即用户在列表中添加元素的同时列表正在迭代并显示在同一页面中。对于我添加的解决方案,如果列表未完整显示,用户无法在其上添加新值。
【解决方案2】:

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

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

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

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

【讨论】:

  • 你能用类似于我的问题的解决方案解释一下吗?
  • @AshutoshSingh - 查看您修改 ArrayList 的地方(这是抱怨的地方)。在遍历 ArrayList 时查看是否这样做。我的猜测是“RemovebooksFromSession”是有罪的一方。
  • @AshutoshSingh - 提示:实际上看看异常回溯!
【解决方案3】:

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

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

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

【讨论】:

  • 没有。因为如果我应用此代码,则会停止运行。我测试过。
猜你喜欢
  • 2012-01-23
  • 2016-11-17
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多