为什么我得到java.util.ConcurrentModificationException?

Suh*_*pta 4 java exception

当我运行以下代码时:

    import java.util.LinkedList;

    class Tester {
      public static void main(String args[]) {
        LinkedList<String> list = new LinkedList<String>();
        list.add(new String("suhail"));
        list.add(new String("gupta"));
        list.add(new String("ghazal"));
        list.add(new String("poetry"));
        list.add(new String("music"));
        list.add(new String("art"));

        try {
            for(String s : list) {
            list.add(0,"art");
            list.remove(6);
            System.out.println(list);
        }
        }catch(Exception exc) {
            exc.printStackTrace();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个例外,说:

java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
    at java.util.LinkedList$ListItr.next(Unknown Source)
    at Tester.main(Tester.java:14)
Run Code Online (Sandbox Code Playgroud)

为什么我得到这个例外?

编辑:tmpList是一个LinkedList,其每个节点都包含DepConfAttr类型的对象.我在内存(最高内存优先)的基础上对tmpList进行排序,这是DepConfAttr对象的属性之一.

上面的代码反映了我试图通过以下代码实现的目标

int size = tmpList.size();
        int elementBC = 0; // element being checked
        int startIndex = 1;
        for (DepConfAttr dca : tmpList) {
            long maxMem = dca.getMemory(); // Let this be the maximum memory
            for(int i = startIndex ; i < size ; i++) {
                DepConfAttr dcaTmp = tmpList.get(i);
                if(maxMem < dcaTmp.getMemory()) {
                    tmpList.add(elementBC, dcaTmp);
                    tmpList.remove(i+1);
                    maxMem = tmpList.get(elementBC).getMemory();                        
                }
            }
            elementBC++;
            startIndex++;
            size--;
        }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

为什么我得到这个例外?

除了通过迭代器之外,您将从列表中删除一个项目,同时迭代它.您在迭代时也会添加到列表中.

你在这里尝试实现的目标并不是很清楚,但除了并发集合之外,当你尝试这样做时,你总是会遇到异常.

对此的一个常见解决方法是首先创建列表的副本并对其进行迭代,然后根据需要修改原始列表.