当前位置: 首页 > 知识库问答 >
问题:

Servlet中的java.util.concurrentModificationException

淳于典
2023-03-14
@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");
    }
}

ConcurrentModificationException

java.util.arrayList$itr.checkforcoModification(arrayList.java:901)java.util.arrayList$itr.next(arrayList.java:851)servlets.addcart.doget

共有1个答案

宫修贤
2023-03-14

不能用增强的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);
 类似资料:
  • 问题内容: 到现在为止,因为它适用于服务的HTTP请求,我想条款- 和意味着同样的事情。但是显然,它们分别在Servlet 3.0和3.1中分别实现。我正在努力了解这里的区别… 请问有人可以进一步阐明这个话题吗?具体来说,我正在寻找一个示例,该示例说明服务器的Servlet 3.0实现如何异步而又在线程上阻塞?我想可能是,如果我理解了这一点,可能更容易理解Servlet 3.1中的非阻塞I / O

  • 我对servlet和spring MVC有基本的了解。但是我不知道spring mvc中是否有servlet的用法。在spring mvc中,我们有控制器类。我的想法是servlet在spring mvc中用作控制器。如果我不正确,请纠正我。

  • 问题内容: 我已经开发了一个将信息发送到的HTML页面。在中,我正在使用方法和: 在调用Servlet的html页面代码中是: method = “get”在Servlet中使用时,我会获得id和password的值,但是在使用时method = “post”,id和password会设置为null。为什么在这种情况下我无法获取值? 我想知道的另一件事是如何使用Servlet生成或验证的数据。例如

  • 问题内容: servlet类有多个实例吗?当我听到“每个servlet实例”时,有人可以详细说明吗? 问题答案: Servlet容器启动时,它: 读; 在类路径中找到已声明的Servlet;和 加载和实例化每个Servlet一次。 大概是这样的: 这些Servlet都存储在内存中,并且每次请求URL与Servlet的关联的匹配时都可以重用url-pattern。然后,Servlet容器执行类似于以

  • 和具有方法的servlet: 通过,我得到了我的主页。 但是,当我单击reference from时,返回: 我的同样位于 我的Servlet用于处理: 和:

  • 消息 说明服务器遇到内部错误(),无法运行 根本原因 根本原因 当我将浏览器用作http://localhost:8080/sample/rest/app/test将返回一个json数据类型。。 产品类 StringService类 StringServiceApplication 我的网络。xml 我的jboss网站。xml 构建路径上的我的库——javassist-3.12.1。GA-json