2016-02-03 100 views
1

我的代碼(縮減到基本要點如下);當hasNext()被稱爲最後一次時,它拋出ConcurrentModificationException- PS-我試過調試它,而且我似乎無法確定如何使其工作。如果我切換remove和add方法,它會起作用,但是如果somethingElse =沒有真正有用的東西,它將刪除唯一的值。迭代器併發修改錯誤(Java)

PS-我知道解決的辦法here的;但我需要它之後去除值增加,這是造成問題的

Iterator<String> itr = something.iterator(); 
while (itr.hasNext()){ 
    String x = itr.next(); 
    itr.remove(); 
    somethingElse.add(x);    
} 

編輯 - somethingElse可以的東西或新對象的全部在一起(有這個決定該環路) 這是我第一次後如果它太抽象或者代碼不清晰,請告訴我,我會發布我的完整代碼。

謝謝! :)

+1

你確定'something'和'somethingElse'是兩個不相關的對象嗎? – Codebender

+0

你能澄清什麼是'somethingElse'。循環中發生的每個操作都必須通過迭代器。如果不使用迭代拋出了'ConcurrentModificationException' –

+0

somethingElse可東西(有一個循環,來確定是否somethingElse的東西或新的對象) – JsDart

回答

0

什麼是你的問題所理解的 - 任何時間點SomethingElse可以是something

如果這是你會得到concurrentModificationException因爲你是遍歷列表,並在您要更新它同一時間的情況下。

因此iterator不知道底層data structure發生了什麼,它會堅持它的政策fail-fast之前發生可怕的錯誤。

(核心值,後跟JDK讀取和寫入,應擺好處理)

+0

這很有道理,謝謝你解釋。但是,交換刪除和添加的順序可修復錯誤;你能否在解釋問題之前向我解釋爲什麼? – JsDart

+0

交換訂單沒有任何區別。可能是當你交換後運行'someThingElse'確實是一個滿足'JVM'的新列表,它適用於你,但在所有其他情況下它將失敗。 – Helios

0

.remove,因爲要修改的列表,而迭代thorugh它拋出這個錯誤。您可以使用ConcurrentHashMap和CopyOnWriteArrayList類來修復此錯誤。

請參考有關錯誤的明確的解釋鏈接here