Ошибка программирования Java: исключение java.util.ConcurrentModificationException - PullRequest
4 голосов
/ 18 декабря 2011

Я пишу программу как часть учебника для начинающего ученика 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 if, тогда программа запустится, хотя она не будет работать должным образом, потому что цикл не будет перебирать пустой ArrayList.

Я пытался добавить продукт, чтобы он не был пустым в других частях кода, но он все равно выдает мне ту же ошибку.Есть идеи?

Ответы [ 2 ]

6 голосов
/ 18 декабря 2011

Вы не можете перебирать тот же список, в который собираетесь добавлять вещи.Держите отдельный список вещей, которые вы собираетесь добавить, а затем добавьте их все в конце.

4 голосов
/ 18 декабря 2011

Вы не должны изменять mCatalog во время итерации по нему.Вы добавляете элемент в этот цикл:

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

См. ConcurrentModificationException и modCount в AbstractList .

...