2013-10-29 17 views
1

我的代碼導致java.util.ConcurrentModificationException錯誤。這是下面的代碼。如何重新設計方法才能正常工作

這裏是確切的錯誤:

java.util.ConcurrentModificationException 
java.util.ConcurrentModificationException 
     at java.util.HashMap$HashIterator.nextEntry(HashMap.java:894) 
     at java.util.HashMap$KeyIterator.next(HashMap.java:928) 
     at ca.on.oicr.pinery.lims.gsle.GsleClient.getOrders(GsleClient.java:720) 

720線是第二個for循環

我之前張貼了這個問題,被告知「您要添加到訂單環多數民衆贊成遍歷內訂單的元素,這就是導致異常的原因,不要修改你在循環中循環的集合,同樣對樣本「。我明白我要重新構建這個方法並收到以下建議。

ListIterator<Order> it = orders.listIterator(); 

while (it.hasNext()) { 
     Order ord = it.next(); 

     if () // some condition 
     it.remove(); // This wil remove the element that we just got using the next() method 
     if () // some other condition 
     it.add(new Order()); // THis inserts the element immediately before the next call to next() 
} 

現在我停留在如何做樣品並利用迭代方法時,因爲你雖然一組迭代不同訂單的增加,我想我會用一個for循環。

這是我越來越困惑如何改變的部分,以便不會得到java.util.ConcurrentModificationException。

f 

到目前爲止,我已經到了這裏。

java.util.ListIterator<Order> it = orders.listIterator(); 
    while (it.hasNext()) { 
    it.next().getId(); 
    if (sampleOrderMap.containsKey((it.next().getId()))) 
    { 
     Set<OrderSample> samples = sampleOrderMap.get(it.next().getId()); 

    } 

    }` 

我只是不知道如何把在其他的方式,我不會讓ConcurrentModificationException的

+5

您可以將一些臨時集合添加到您正在迭代的其他集合中。 然後,在完成迭代之後,將新的臨時集合添加到原始集合中。 –

+0

此問題需要標題更改。不完全確定要做什麼。 – Cruncher

回答

2

從Java文檔:

ConcurrentModificationException的可通過已檢測到併發方法拋出當這種修改不被允許時修改對象。 例如,一個線程在另一個線程迭代它時通常不允許修改一個Collection。一般來說,在這些情況下迭代的結果是不確定的。某些迭代器實現(包括由JRE提供的所有通用集合實現的實現)可能會選擇在檢測到此行爲時拋出此異常。這樣做的迭代器被稱爲快速迭代器,因爲它們快速且乾淨地失敗,而在將來未定的時間冒着任意的,非確定性的行爲冒險。

請注意,此異常並不總是表示某個對象已被另一個線程同時修改。如果單個線程發出違反對象合約的一系列方法調用,則該對象可能會拋出此異常。例如,如果一個線程在使用快速迭代器迭代集合的同時直接修改集合,迭代器將拋出此異常。

請注意,故障快速行爲無法得到保證,因爲一般來說,不可能在出現非同步併發修改時做出任何硬性保證。快速失敗操作盡最大努力拋出ConcurrentModificationException。因此,編寫一個依賴於此異常的程序是正確的:編寫ConcurrentModificationException應該只用於檢測錯誤。

要解決這個問題,您可以創建一個臨時集合添加到您正在迭代的其他集合之外。

然後,迭代完成後,可以使用orders.AddAll(tempCollection)添加新項目。

+0

您的回答與您的評論相同 – SSP

+0

@SSP如果評論值得作爲答案,那完全可以。這就是說,在這種情況下的一些細節可能對答案有好處。 – Cruncher

+0

當我「將新的臨時集合添加到原始」我將不得不迭代通過訂單,以獲得它的每個訂單? – user2811419