2013-08-31 51 views
-2

我無法理解的原因,爲什麼下面的代碼拋出CME,即使它被運行爲單線程應用的java + ConcurrentModificationException的的forEach(增強)循環單線程

import java.util.ArrayList; 
import java.util.List; 

public class ConcurrentModification { 

    public static void main(String[] args) { 
     ConcurrentModification con = new ConcurrentModification(); 
     con.call(); 
    } 

    void call() { 
     List<Integer> l = new ArrayList<Integer>(); 
     for (int i = 0; i <= 10000; i++) { 
      l.add(i); 
     } 

      for (Integer j : l) { 
       if (j % 3 == 0) { 
        l.remove(j); 
       } 
      } 


    } 
} 

原因:(在經過答案和其他鏈接後)

You are not permitted to mutate a list while you are iterating over it. 
Only Iterator remove's method can be used to delete element from list 
For Each loop is using iterator beneath it 
but l.remove(j) is not using that iterator, which causes the exception 
+0

你從列表中,當你迭代它刪除的項,但不會使用'Iterator.remove'執行刪除操作。有很多重複的 - 我會嘗試找到一個... –

回答

1

您在迭代時不允許對列表進行變異。您的l.remove(j)導致列表l發生變化,但您在for (Integer j : l)循環內。

+0

一個問題,是不是每個循環使用它下面的迭代器 –

+1

@Naroji:是的,但'l.remove(j)'是不使用該迭代器,這會導致您觀察到的異常。 –

0

爲此,您需要使用迭代器

for (Iterator<ProfileModel> it = params[0].iterator(); it 
         .hasNext();) { 

        ProfileModel model = it.next(); 

        DBModel.addProfile(homeScreenActivity, model, profileId); 
       } 

我用它來在database..Hope添加數據可以幫助