2014-02-23 77 views
2

我想迭代與迭代器的ArrayList。問題是我得到ConcurrentModificationException。我已經檢查了很多這樣的問題。所有人都表示,在遍歷迭代時修改ArrayList時會發生異常。但我認爲我的問題有點不同,因爲即使使用Iterator方法,我也沒有修改ArrayListConcurrentModificationException使用迭代器時

 Cliente cliente1 = new Cliente(16096,"Alberto1","pass",1500.0,false); 

    ArrayList<Cliente> miLista = new ArrayList<Cliente>(); 

    Iterator<Cliente> miIterador = miLista.iterator(); 

    miLista.add(cliente1); 

    System.out.println(miLista.get(0).nombre); //This displays "Alberto1" 
    System.out.println(miIterador.hasNext()); //This displays 'true' 
    miIterador.next(); //Here I get the exception 

我不知道如何解決它。這可能是一個愚蠢的問題,因爲實際上我是初學者,但我被困在這裏。

謝謝。

暴病死甚至不能回答我的問題,所以我的答案編輯的問題:

非常感謝各位!你所有給我正確的答案:d對不起,順便把愚蠢的問題:P

解決

+1

重新排序後'迭代 miIterador = miLista.iterator();'和'miLista。加(cliente1);' – toniedzwiedz

+0

太好了!就是這樣!非常感謝你! – Alber8295

回答

4

此行是罪魁禍首。除了通過迭代器自己的刪除或添加方法之外,您不能以任何方式在獲取迭代器之後修改列表。

miLista.add(cliente1); 

通過ArrayList類的iterator和listIterator方法返回的迭代器是快速失敗的:如果列表隨時結構上修改後的迭代器創建的,以任何方式,除了通過迭代器自身的remove或add方法,迭代器將拋出ConcurrentModificationException

+0

完美答案!非常感謝你! – Alber8295

+0

歡迎您:) – Zeeshan

3

「但我認爲,我的問題是有點不同,因爲我 不修改的ArrayList甚至與迭代器的方法。」

但你是通過添加元素修改列表:)

ArrayList<Cliente> miLista = new ArrayList<Cliente>(); 

    Iterator<Cliente> miIterador = miLista.iterator(); 

    miLista.add(cliente1); 
    ^^^^^^^^^^^^^^^^^^^^^^ here! 
1

這是有問題的線路,您是通過將對象將其morfing數組列表。迭代器是在真正的數組列表中生成的,因此它將異常作爲失敗快速樣式引發。

miLista.add(cliente1); 

這是ArrayList類 的一段代碼,當你調用迭代器它GETNEXT燒製。

final void checkForComodification() { 
      if (modCount != expectedModCount) 
       throw new ConcurrentModificationException(); 
     } 
0

要修改名單後你產生Iterator。只是互換線

Iterator<Cliente> miIterador = miLista.iterator(); 

miLista.add(cliente1); 

和一切都會正常工作。

0

一種替代方法是用一個代替的ListIterator和倒帶迭代器在插入新的客戶機

Cliente cliente1 = new Cliente(16096,"Alberto1","pass",1500.0,false); 

    ArrayList<Cliente> miLista = new ArrayList<Cliente>(); 

    ListIterator<Cliente> miIterador = miLista.listIterator(); 

    miIterador.add(cliente1); 
    miIterador.previous(); 

    System.out.println(miLista.get(0).getHombre()); //This displays "Alberto1" << notice you're not using the iterator here 
    System.out.println(miIterador.hasNext()); //This displays 'true' 
    System.out.println(miIterador.next().getHombre()); //This displays "Albert1" again 
相關問題