java.util.ConcurrentModificationException出现

时间:2015-03-24 07:23:59

标签: java java-ee

可能是一个重复的问题,我很抱歉。但我的问题不是解决。

下面的代码在foreach循环中第二次执行时给出了这个异常(java.util.ConcurrentModificationException)。甚至我使用迭代器删除了arraylist对象。

@RequestMapping("edit")
public ModelAndView editItemToInvoice(HttpSession session,@RequestParam("itemname")String itemname){

    ArrayList<InvoiceEntities> show=(ArrayList<InvoiceEntities>)session.getAttribute("invoices");

    if(show==null){
        show=new ArrayList<InvoiceEntities>();
    }

    ArrayList<InvoiceEntities> edit=new ArrayList<InvoiceEntities>();

    for(InvoiceEntities itemnam:show){
        if(itemnam.getItemName().equals(itemname)){
            int index=show.indexOf(itemnam);
            edit.add(show.get(index));

            Iterator<InvoiceEntities> iter = show.iterator();
            while(iter.hasNext()){
                InvoiceEntities getitem=iter.next();
                if(getitem.getItemName().equals(itemname)){
                    iter.remove();
                    //break;
                }
            }

        }
    }

    System.out.println(session.getAttribute("invoices"));

    ModelAndView model=new ModelAndView();
    session.setAttribute("invoices", show);
    model.addObject("editobj",edit);
    model.addObject("items",session.getAttribute("invoices"));
    model.setViewName("jsp/Invoice");

    return model;
}

异常是java.util.ConcurrentModificationException

 SEVERE: Servlet.service() for servlet [spring-dispatcher] in context with  
 path [/Invoice] threw exception [Request processing failed; nested 
 exception is java.util.ConcurrentModificationException] with root cause
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at   mine.Controllers.InvoiceContorller.editItemToInvoice(InvoiceContorller.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)

3 个答案:

答案 0 :(得分:3)

for(InvoiceEntities itemnam:show)

在场景后面创建一个show的迭代器,然后在for循环中创建另一个迭代器:

Iterator<InvoiceEntities> iter = show.iterator();

并使用第二个迭代器通过调用show来修改iter.remove();,而第一个迭代器仍在迭代同一个集合。

有关详细信息,请参阅ConcurrentModificationException文档中以“例如”开头的段落。

答案 1 :(得分:2)

执行时

iter.remove();

您在使用不同的 迭代器迭代 时修改集合。 ArrayList不允许这样做。

答案 2 :(得分:0)

ArrayList是一个Fail-Fast迭代器集合。所以,你不应该在迭代时修改它。因此,当您尝试从代码中的列表中删除项目时,请确保它。