Servlet 中的 java.util.ConcurrentModificationException

Mat*_*tia 1 java collections iterator servlets arraylist

编辑:我明白我的错误。我不知道为什么,但我想在previousItems.add(p);执行后它会从for loop. 我已经通过添加解决了break

\n\n

关于此异常的其他问题并没有帮助我找到解决方案。

\n\n

Servlet当我从另一个页面向购物车添加商品时,我有一个被调用的函数。

\n\n

我有一个ArrayList<Product>,我迭代列表以检查我尝试添加的相同产品是否已在列表中。如果它已经存在,我会更新其数量,否则我会在列表中添加新产品。

\n\n

如果添加始终相同的产品,一切都很好,当我添加不同的产品时,会发生异常。所以我认为代码中的问题是在else(用“This”注释)之后,因为如果产品不同,它就会被执行。

\n\n
@WebServlet(name = "AddCart", urlPatterns = {"/AddCart"})\npublic class AddCart extends HttpServlet {\n\n    @Override\n    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        HttpSession session = request.getSession();\n        ArrayList<Product> previousItems = (ArrayList<Product>) session.getAttribute("previousItems");\n        Product p = (Product) session.getAttribute("currentProduct");\n        if (previousItems == null) {\n            previousItems = new ArrayList<Product>();\n        }\n\n            if (p != null) {\n                if (previousItems.size()>0) {\n                    for (Product p1 : previousItems) {\n                        if (p1.getId() == p.getId()) {\n                            p1.addQuantity();\n                        } else { //This\n                            previousItems.add(p);\n                        }\n                    }\n                } else {\n                    previousItems.add(p);\n                }\n            }\n\n        session.setAttribute("previousItems", previousItems);\n        response.sendRedirect("cart.jsp");\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我也尝试删除synchronized相同的异常。

\n\n

这就是HTTP Status 500 \xe2\x80\x93 Internal Server Error

\n\n
\n

java.util.ConcurrentModificationException

\n\n
\n

java.util.ArrayList$Itr.checkForCommodification(ArrayList.java:901)\n java.util.ArrayList$Itr.next(ArrayList.java:851)\n servlets.AddCart.doGet(AddCart.java:36)\n javax.servlet.http.HttpServlet.service(HttpServlet.java:635)\n javax.servlet.http.HttpServlet.service(HttpServlet.java:742)\n org.apache.tomcat.websocket.server.WsFilter.doFilter( WsFilter.java:52)

\n
\n
\n

And*_*ner 6

您无法将项目添加到使用增强的 for 循环迭代的列表中。这是因为您正在修改列表的内部状态;虽然可以处理这个问题,但大多数迭代器实现不处理底层集合的状态更改,以便在绝大多数用例中保持简单。

而不是这个:

for (Product p1 : previousItems) {
    previousItems.add(p); // Simplified
}
Run Code Online (Sandbox Code Playgroud)

如果您想p位于之后的列表中,请将其放入另一个列表中,然后在迭代后添加该列表:

List<Product> other = new ArrayList<>();
for (Product p1 : previousItems) {
    other.add(p);
}
previousItems.addAll(other);
Run Code Online (Sandbox Code Playgroud)