2013-03-11 115 views
0

當遍歷地圖ConcurrentModificationException的迭代地圖

for (String sourceKey : sMap.getContent().keySet()) { 

     List<String> sourceValues = sMap.getValues(sourceKey); 
     List<String> targetValues = tMap.getValues(sourceKey); 

     if (areMultiple(sourceValues)) { 
     .... 
    } 

sMap.getContent()回報Map<String, List<String>>,其中我只得到密鑰的內容時,我收到ConcurrentModificationException

請注意,不會修改地圖的內容。我只是在這裏迭代。

我在這裏做錯了什麼?當拋出異常時我該如何糾正這種情況?

+4

你應該張貼你的循環的內部,因爲這可能是其中的例外是從 – jbabey 2013-03-11 19:17:27

+0

來我建議構建[SSCCE(HTTP:// SSCCE。 ORG)。您可能會發現某些您無法從程序中刪除而不會使異常消失的情況。仔細查看那段代碼。 – 2013-03-11 19:18:42

+0

更新的問題,包括更多的行 – JAM 2013-03-11 19:19:11

回答

2

如果正在迭代的基礎集合被Iterator本身以外的其他任何東西修改,則會發生這種情況。

嘗試使用的ConcurrentHashMap,而不是一個簡單的HashMap

+0

使用迭代器重寫。所有工作。謝謝 – JAM 2013-03-11 19:22:20

+0

@Jam有點令人不安,因爲這不應該有所作爲。 'sMap.getContent()。keySet()'將簡單地創建映射的返回鍵集的interator。 – 2013-03-11 19:26:20

+1

@PSR:沒有必要使用ConcurrentHashMap。該代碼的問題是foreach循環的一個限制,你可以在Java教程中閱讀:「當你需要刪除當前元素時,使用Iterator而不是for-each構造。for-each構造隱藏迭代器,所以你不能調用remove。「鏈接:http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html – 2013-03-11 20:17:40