不修改列表却仍然收到ConcurrentModificationException异常

3

在您看到另一个ConcurrentModificationException问题时,不要让您的眼睛模糊,因为这不是您典型的ConcurrentModificationException问题。

我了解ConcurrentModificationExceptions,但我不明白为什么在以下代码中会出现此异常。在下面的'for'循环中,似乎迭代器继续存在于for循环之外。(使用eclipse中的调试器,我可以看到迭代器保留了jList的modCount值,当重新启动循环时。)

public class ForEachTest {
  public static void main(String[] args) {
    List<Integer> zList = new LinkedList<Integer>();
    List<Integer> jList = new LinkedList<Integer>();
    jList.add(1);

    while (true) {
      for (Integer j : jList) {
        zList.add(17);
        System.out.println(j);
      }
      jList = zList;
    }
  }
}

一开始我以为这可能是语法糖的问题,但是我使用显式迭代器重写了它,并遇到了相同的行为。

最后,我将for循环拆分为一个while循环和一个单独的初始化步骤来重写它,所以我不是在寻找仅仅为了让它工作而进行重写。但是如果可能的话,我更愿意使用for-each语法。但我想知道这里显示的方式有什么问题。


请注意,我的回答解释了为什么会发生这种情况(基本上是您典型的ConcurrentModificationException问题)- 但是您没有解释您试图做什么,因此我无法建议替代方案。 - Jon Skeet
1个回答

19

看看你的循环:

while (true) {
  for (Integer j : jList) {
    zList.add(17);
    System.out.println(j);
  }
  jList = zList;
}

在外层循环的第二次迭代中,由于 jList = zList; 语句,jListzList 引用相同的列表... 因此当你在内部循环中向 zList 添加内容时,你修改了正在迭代的列表。问题来了。


抢我答案了...我刚打完...+1。 - Thomas Owens
那值得被接受。你无法再增加任何东西。 - serg10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接