【问题标题】:Java Programming Error: java.util.ConcurrentModificationExceptionJava 编程错误:java.util.ConcurrentModificationException
【发布时间】:2012-01-23 03:12:24
【问题描述】:

我正在编写一个程序作为 Java 初学者教程的一部分。我有以下方法,每当我运行它时,它都会给我以下异常:

  java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at Warehouse.receive(Warehouse.java:48)
        at MainClass.main(MainClass.java:13)

这是类 Warehouse 中的方法本身:

public void receive(MusicMedia product, int quantity) {

  if ( myCatalog.size() != 0) { // Checks if the catalog is empty

    // if the catalog is NOT empty, it will run through looking to find
    // similar products and add the new product if there are none
    for (MusicMedia m : myCatalog) { 
        if ( !m.getSKU().equals(product.getSKU()) ) {
                myCatalog.add(product);
        }
    }

  } else { // if the catalog is empty, just add the product
        myCatalog.add(product);
  }
}

问题似乎出在 if else 语句上。如果我不包含 if else,那么程序将运行,尽管它不会正常工作,因为循环不会遍历空的 ArrayList。

我尝试添加一个产品只是为了防止它在代码的其他部分为空,但它仍然给我同样的错误。有什么想法吗?

【问题讨论】:

    标签: java exception arraylist concurrentmodification


    【解决方案1】:

    您不能遍历要添加内容的同一个列表。单独列出您要添加的内容,然后将它们全部添加到最后。

    【讨论】:

    • 所以迭代和添加不同时发生并不重要吗? (由 if else 分隔)
    • 在迭代集合时不能修改集合。这就是 Java 中 any ConcurrentModificationException 的原因。
    • @user1104775 没关系。您不能在迭代循环中修改集合。
    • 我似乎过于关注第二个添加,我忘记了循环中的第一个。谢谢!
    • @user1104775 你是什么意思,不是同时迭代和添加?在 for (...) { 和结束 } 之间发生的所有事情都有使用 MusicMedia m 创建的开放迭代器:myCatalog 范围内。它是 if (!m.getSku()...) 中的 myCatalog.add(...) ,这是一个并发修改。 - 啊,你自己也注意到了:)
    【解决方案2】:

    您在迭代 mCatalog 时不得修改它。你在这个循环中添加了一个元素:

    for (MusicMedia m : myCatalog) { 
        if ( !m.getSKU().equals(product.getSKU()) ) {
                myCatalog.add(product);
        }
    }
    

    参见AbstractList 中的ConcurrentModificationExceptionmodCount

    【讨论】:

    • 非常感谢,盯着代码看太久好像忘记了那部分。
    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2016-11-17
    • 2016-09-28
    • 1970-01-01
    • 2014-12-12
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多