3

我在执行此代码时收到 ConcurrentModificationException。我无法弄清楚为什么会这样?

private void verifyBookingIfAvailable(ArrayList<Integer> list, int id) {

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
                int value = iterator.next();
                if (value == id) {
                    int index = list.indexOf(id);

                    if (index != -1) {
                        list.remove(index);
                    }
                }
        }
    }

提前致谢。

4

4 回答 4

11

您正在使用list引用本身删除列表中的元素,它可以抛出ConcurrentModificationException. 请注意,这有时可能会起作用,但并非总是如此,并且不能保证完美地工作。

此外,即使您使用Iterator迭代列表,您仍然不应该使用list.remove,您应该只使用iterator.remove()删除元素,否则它不会有任何区别,无论您使用迭代器还是增强的 for 循环。

因此,用于iterator.remove()删除元素。

if (index != -1) {
    iterator.remove(value);
}

请参阅这篇文章:- java-efficient-equivalent-to-removing-while-iterating-a-collection以获得更详细的解释。

于 2012-11-09T11:44:39.697 回答
1

仅仅是因为您试图ArrayList在迭代它们时从中删除元素。要解决此问题,请使用java.util.concurrent.CopyOnWriteArrayList。希望这可以帮助。

于 2012-11-09T11:45:32.963 回答
0

发生的情况是 ArrayList 迭代器并非旨在在您对其进行迭代时启用修改。

所以,为了避免来自不连贯数据的更严重的错误,它有一个修改计数,当你删除一个项目时更新它,并在你迭代时检查:

从 ArrayList.java :

411     public E remove(int index) {
412         rangeCheck(index);
413 
414         modCount++;
415         E oldValue = elementData(index);
416 
417         int numMoved = size - index - 1;
418         if (numMoved > 0)
419             System.arraycopy(elementData, index+1, elementData, index,
420                              numMoved);
421         elementData[--size] = null; // Let gc do its work
422 
423         return oldValue;
424     }
     ...
779 
780         final void checkForComodification() {
781             if (modCount != expectedModCount)
782                 throw new ConcurrentModificationException();
783         }

如 javadoc 中所述:

返回的列表迭代器是快速失败的。

为避免此问题,请使用迭代器删除当前元素,而不是直接删除列表。迭代器的remove方法确保迭代器保持一致。

于 2012-11-09T11:45:36.090 回答
0

试试这个

private void verifyBookingIfAvailable(ArrayList<Integer> list, int id) {

        List<Integer> tempList =new ArrayList<Integer>();
    tempList.addAll(list);

     for(Integer value :tempList) {

         if (value == 1) {
             int index = tempList.indexOf(1);

             if (index != -1) {

                 list.remove(index);
             }
         }
 }
}

迭代时,您正在删除对象

于 2012-11-09T11:45:37.113 回答