小编典典

为什么会收到ConcurrentModificationException?

java

为什么在代码的指定位置出现ConcurrentModificationException?我无法弄清楚自己在做什么错…
removeMin()正在使用该方法在列表中找到分钟pq,将其删除并返回其值

import java.util.Iterator;
import java.util.LinkedList;

public class test1 {

    static LinkedList<Integer> list = new LinkedList<Integer>();

    public static void main(String[] args) {
        list.add(10);
        list.add(4);
        list.add(12);
        list.add(3);
        list.add(7);

        System.out.println(removeMin());
    }

    public static Integer removeMin() {
        LinkedList<Integer> pq = new LinkedList<Integer>();
        Iterator<Integer> itPQ = pq.iterator();

        // Put contents of list into pq
        for (int i = 0; i < list.size(); i++) {
            pq.add(list.removeFirst());
        }

        int min = Integer.MAX_VALUE;
        int pos = 0;
        int remPos = 0;

        while (itPQ.hasNext()) {
            Integer element = itPQ.next(); // I get ConcurrentModificationException here
            if (element < min) {
                min = element;
                remPos = pos;
            }
            pos++;
        }

        pq.remove(remPos);
        return remPos;
    }

}

阅读 245

收藏
2020-11-30

共1个答案

小编典典

一旦修改了从其获得的Collection,则不应认为Iterator可用。(对于java.util.concurrent。*集合类,放宽了此限制。)

您首先要获得一个Iterator pq,然后进行修改pq。修改之后pq,Iterator
itPQ不再有效,因此当您尝试使用它时,您会收到ConcurrentModificationException。

一种解决方案是Iterator<Integer> itPQ = pq.iterator();while循环之前向右移动。更好的方法是完全不使用Iterator:

for (Integer element : pq) {

从技术上讲,for-each循环在内部使用Iterator,因此无论哪种方式,此循环仅在您不尝试pq在循环内进行修改时才有效。

2020-11-30