【问题标题】:java.util.ConcurrentModificationException error while modify a object [duplicate]修改对象时出现java.util.ConcurrentModificationException错误[重复]
【发布时间】:2021-08-05 22:01:35
【问题描述】:

我正在编写一个购物车,当我添加一个在 arraylist 中的产品时,应用程序会抛出一个异常,我不知道为什么。所以,这就是我现在使用的代码。有什么帮助吗?

//the arraylist is not empty

public static ArrayList<mercadonaProducts> mercadonaCartProducts = new ArrayList<>();


if(mercadonaCartProducts.isEmpty()){
               mercadonaCartProducts.add(new mercadonaProducts(product_name.getText().toString(),price.getText().toString().substring(7,11),String.valueOf(count[0]),String.valueOf(Double.parseDouble(price.getText().toString().substring(7,11))*count[0])));
                        saveCart(v);
                    }else{
                        for(mercadonaProducts product : mercadonaCartProducts){
                            if(product.getCartproduct_name().equals(product_name.getText().toString())){
                                product.setQty(String.valueOf(Integer.parseInt(product.getQty())+count[0]));
                                product.setTotalprice(Double.parseDouble(product.getQty())*product.getCartprice());
                                saveCart(v);
                            }else{
                                mercadonaCartProducts.add(new mercadonaProducts(product_name.getText().toString(),price.getText().toString().substring(7,11),String.valueOf(count[0]),String.valueOf(Double.parseDouble(price.getText().toString().substring(7,11))*count[0])));
                                saveCart(v);
                            }
                        }
                    }

【问题讨论】:

  • 我不这么认为,我不想使用迭代器因为我想修改数组列表中那个位置的对象数据,我认为使用迭代器我做不到
  • 你添加到mercadonaCartProducts 同时迭代它。这是一个禁忌。

标签: java android


【解决方案1】:

这里

for (mercadonaProducts product : mercadonaCartProducts) {

您正在迭代 mercadonaCartProducts 的产品

在你调用的 else 分支的循环中

mercadonaCartProducts.add(new mercadonaProducts(...));

因此,在遍历列表时,您也在列表中添加新元素。

为避免 ConcurrentModificationException 将 for 指令改为

ArrayList<mercadonaProducts> mercadonaCartProductsCopy = new ArrayList(mercadonaCartProducts);
for (mercadonaProducts product : mercandonaCartproductsCopy) {

如果不涉及并发,这就足够了。

【讨论】:

  • 您的意思是在每个声明中将for (mercadonaProducts product : mercadonaCartProducts) { 更改为for (mercadonaProducts product : new ArrayList(mercadonaCartProducts)) { ???我认为这是行不通的,不是吗?我的意思是 foreach 会抛出一个错误,因为需要一个对象并且该声明不起作用
  • @maarcoscuesta18 能报告一下会抛出什么错误吗?
  • 用你的代码for (mercadonaProducts product : new ArrayList(mercadonaCartProducts)) { 出现这个--> 必需类型:提供的对象:mercadonaProducts
  • @maarcoscuesta18 你是对的。我更新了答案
  • @maarcoscuesta18:你只需要new ArrayList&lt;mercadonaProducts&gt;(...)。避免raw types
猜你喜欢
  • 1970-01-01
  • 2015-05-27
  • 2016-11-17
  • 2013-08-16
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多