2010-09-10 162 views
3

在您關注另一個ConcurrentModificationException問題之前,您並不是您典型的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-each語法。

+0

請注意,我的答案解釋了爲什麼會發生這種情況(它*基本上是您典型的ConcurrentModificationException問題) - 但您沒有解釋您要做什麼,所以我一直無法提供替代方案。 – 2010-09-10 16:34:46

回答

19

看看你的循環:

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

在外環的第二次迭代,jListzList指向同一個列表(由於jList = zList;語句)......所以,當您添加到zList內你的內部循環,你正在修改你正在迭代的列表。砰。

+0

打我吧......我剛剛輸完我的答案...... + 1。 – 2010-09-10 16:29:52

+0

+1是正確的 - 好工作,Jon Skeet。 – 2010-09-10 16:32:15

+0

這是值得接受的。沒有什麼可以補充的。 – serg10 2010-09-10 16:45:19

相關問題