Java ArrayList购物车添加新商品条目不生效问题
简易购物车功能添加商品失效问题修复
代码核心错误点
你的代码存在3个逻辑问题,直接导致商品无法正常加入购物车:
- 空购物车场景下新增逻辑完全不触发:首次请求时
cart初始化为空集合,for-each遍历空集合不会执行循环体,新商品永远不会被添加到集合中 - 遍历集合时直接修改集合触发异常:for-each循环执行过程中调用
cart.add()会触发ConcurrentModificationException,非空购物车场景下代码会直接运行报错 - 新增逻辑位置错误导致重复条目:遍历过程中只要当前遍历项不是目标商品就新增条目,会导致单次添加操作生成多条重复商品数据,完全不符合业务逻辑
修正后代码
String pid = request.getParameter("id"); String price = request.getParameter("price"); HttpSession s = request.getSession(); ArrayList<CartItem> cart = (ArrayList<CartItem>) s.getAttribute("cart"); if(cart == null){ cart = new ArrayList<>(); } boolean hasExisted = false; for (CartItem item : cart) { if (item.getId().equals(pid)) { item.setCount(item.getCount() + 1); hasExisted = true; break; } } if (!hasExisted) { // 若CartItem的price字段为数值类型,请先做类型转换,例如:double realPrice = Double.parseDouble(price); cart.add(new CartItem(pid, 1, price)); } s.setAttribute("cart", cart);
修复逻辑说明
- 新增商品操作移到循环外部执行,解决空购物车无法添加商品的问题
- 用布尔标记位记录商品是否存在,不在遍历过程中修改集合,避免并发修改异常
- 匹配到对应商品后直接跳出循环,减少无效遍历,同时避免重复生成商品条目
- 注意参数类型匹配:从请求中获取的
price是String类型,如果CartItem类的price属性是数值类型,需要提前做类型转换,避免类型转换异常
内容的提问来源于stack exchange,提问作者Peloucvo
相关产品推荐
相关产品推荐

