Servlet 中的 java.util.ConcurrentModificationException

标签 java servlets arraylist collections iterator

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

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

我有一个Servlet当我从另一个页面将商品添加到购物车时会调用该函数。

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

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

@WebServlet(name = "AddCart", urlPatterns = {"/AddCart"})
public class AddCart extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        ArrayList<Product> previousItems = (ArrayList<Product>) session.getAttribute("previousItems");
        Product p = (Product) session.getAttribute("currentProduct");
        if (previousItems == null) {
            previousItems = new ArrayList<Product>();
        }

            if (p != null) {
                if (previousItems.size()>0) {
                    for (Product p1 : previousItems) {
                        if (p1.getId() == p.getId()) {
                            p1.addQuantity();
                        } else { //This
                            previousItems.add(p);
                        }
                    }
                } else {
                    previousItems.add(p);
                }
            }

        session.setAttribute("previousItems", previousItems);
        response.sendRedirect("cart.jsp");
    }
}

我还尝试删除 synchronized同样的异常。

这是HTTP Status 500 – Internal Server Error

java.util.ConcurrentModificationException

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

最佳答案

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

而不是这个:

for (Product p1 : previousItems) {
    previousItems.add(p); // Simplified
}

如果您希望 p 出现在之后的列表中,请将其放入另一个列表中,然后在迭代后添加该列表:

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

关于Servlet 中的 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45654000/

相关文章:

java - OSGi 中的 OpenJPA 找不到 MySQL JDBC 连接器包

Java - 解析 RESTful 资源 URL 的更好方法

java - 在 Netbeans 8 中运行时,即使将其 jar 放在 Tomcat home/lib 文件夹中,也找不到 JDBC 驱动程序

java - 使用从游标获取的数据使用 arrayList<String> 填充 ListView

vb.net - Vb Net检查arrayList是否包含子字符串

java - 使用 JSR-303 进行 Bean 验证

java - 将 Jar Artifact 从 Bamboo 部署到 Artifactory

java - 创建 ImageButton 时出现 NullPointerException

java - response.sendRedirect() 未正确重定向

android - 动态加载 Assets 文件夹中的所有图像