2015-05-21 52 views
0

的ArrayList中我用java.util.ConcurrentModificationException錯誤時,請參考陣列

ArrayList<char[]> record = new ArrayList<char[]>(); 

定義陣列 的ArrayList中,但是當我想指的元素此ArrayList,我寫道:

for(char[] char1 : record){ 
    if(Arrays.equals(char1, char2)){ 
     return false; 
    } 
    record.add(char2); 
} 

它沒有工作,有喜歡的錯誤消息:

java.util.ConcurrentModificationException

本着3210

for(char[] char1 : record){ 

這有什麼錯我的代碼? 謝謝!

+8

您在迭代列表時突變列表。不要這樣做。 –

+0

只需在循環外部移動'record.add(char2)',你就會好起來的。 –

回答

0

看一看的Javadoc的ArrayList:

此類的iterator和listIterator方法返回的迭代器是快速失敗的:如果列表在任何時間從結構上修改創建迭代器後,在除了通過迭代器自己的remove或add方法之外的任何方式,迭代器都會拋出ConcurrentModificationException。

增強的for循環,你用過喜歡上了這行:

for(char[] char1 : record){ 

隱式地創建一個列表迭代器,並遍歷它。

問題出現就行了:

record.add(char2); 

你遍歷它,你正在修改的列表中,你需要使用該列表的迭代器遍歷並添加適當的。

一個可能的解決方案是手動檢索列表迭代器並迭代,這將暴露對add()方法的訪問,該方法可用於在迭代時將項添加到列表中。例如:

// Here we manually retrieve the list iterator to work with 
ListIterator<char[]> iter = record.listIterator(); 

// Iterating through the entire list is done via the `hasNext()` method 
while(iter.hasNext()){ 
    char[] char1 = iter.next(); 

    if(Arrays.equals(char1, char2)){ 
     return false; 
    } 

    // Note: the add() method can only be called once per next() method call 
    iter.add(char2); 
} 

請注意,一旦添加,列表迭代器將最終迭代到新添加的元素中。爲了防止這種情況發生,可以將新元素添加到臨時保留列表中,然後根據需要進行傳輸(例如迭代完成時)。

+0

問題的解釋是可以的(更詳細的說Jon Skeet的,但是沒問題)。建議的解決方案不是。 –

+0

@LuiggiMendoza也許我在這裏誤解了一些東西,建議的解決方案有什麼問題?這裏的解決方案的功能與OP的意圖基本相同,尤其是對於這樣的小問題,除非我嚴重錯過了OP的觀點。無論如何,如果有幫助,我會添加更多理由來解釋爲什麼需要它。 – initramfs

+0

謝謝!它有助於! – Eleanor

-1

在遍歷它時不能修改列表,因爲這會創建無限循環而無法轉義。

如果你正在嘗試完成是的char2n副本添加到record到底哪裏n是陣列char1recordchar2第一次出現之前不等於char2數,那麼你應該簡單地算一下有很多,然後在事實或類似的東西之後添加許多副本。

ArrayList<char[]> record2 = new ArrayList<char[]>(); 
for(char[] char1 : record){ 
    if(Arrays.equals(char1, char2)){ 
     break; 
    } 
    record2.add(char2); 
} 
record.addAll(record2); 

以上是我會做的。我將其添加到不同的列表中,然後在退出後將它們全部添加到record的末尾。