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

コードが「books.add(book);」を実行する頃にページが更新される可能性があります。この場合、他の誰かがコレクションを使用しているのと同時にコレクションを変更しているため、例外が発生します。

AddBookToSessionで変更する「本」が本の内部リストのコピーになるようにコードを変更することは可能ですか。

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

基本的に、他のオブジェクトが変更されていない最初のオブジェクトの状態に依存している間に、オブジェクトを変更しています。

これは、ある種のコレクション オブジェクトで変更に対して安全でないイテレータを使用してから、コレクションを変更する場合に最もよく見られます。

私の JSP はさびすぎてソースを調べられませんが、イテレータを使用しているように見えるケースがいくつか見られますが、JSP 内のものが最も疑わしいと思われます。

(このエラーは、マルチスレッドを使用してコレクション オブジェクトを非スレッド セーフな方法で管理する場合にも発生する可能性があると思います。)

于 2012-12-10T18:49:15.753 に答える
0

例外スタック トレースs:iteratorは、jsp 内の が例外がスローされる場所であることを示しています。つまり、その要素が本のリストを通過している間に、別のコードがリストに追加またはリストから削除されます。それはあなたの Java コードかもしれませんし、何か他のもの (例えばRemovebooksFromSession) かもしれません。

コードを調べて、jsp ページのビルド中に他のコードが実行される可能性があるかどうかを判断してください。

あなたが投稿したコードでこれ以上あなたを助けることはできません。

于 2012-12-11T08:08:38.230 に答える