2011-11-11 160 views
3

我寫了以下代碼導致併發修改異常。我怎樣才能防止它?這個想法是逃避Map的所有值,並用新的參數映射重建對象(dO)。Java併發修改異常

try { 
     Map<String,String[]> paramMap = dO.getParameterMap(); 
     Set<Map.Entry<String, String[]>> entries = paramMap.entrySet(); 
     Iterator<Map.Entry<String, String[]>> it = entries.iterator(); 
     while (it.hasNext()) { 
      Map.Entry<String, String[]> entry = it.next(); 
      String[] values = entry.getValue(); 
      List<String> valList = new ArrayList<String>(); 
      if (values != null) { 
       for (String value : values) { 
        valList.add(escapeHTML(value)); 
        } 
       dO.removeParameter(entry.getKey()); 

//請注意,參數是一個HashMap是,是否需要在插入前先刪除該條目或將取代與鍵關聯的新的價值。它如何在Java中工作?

   dO.addParameter(entry.getKey(),valList.toArray(new String[valList.size()])); 
       } 
      } 
     } 

回答

12

拋出異常,因爲您要添加/從地圖中刪除的東西,而你迭代它:

dO.removeParameter(entry.getKey()); 
dO.addParameter(entry.getKey(),valList.toArray(new String[valList.size()] 

你應該使用iterator.remove()代替。

0

不知道你需要改變Map的鍵,看起來你想要做的就是改變數組中的值。

for(String[] values: dO.getParameterMap().values()) 
    for (int i = 0; i < values.length; i++) 
     values[i] = escapeHTML(values[i]); 

我會確保地圖確實有存儲null值。但是,如果您無法更改此設置,則需要添加if(values != null)

0

只有在更改地圖中的某個鍵時,才應該刪除/添加。正如我在代碼中看到的那樣,你只是在改變價值。因此,您可以改用entry.setValue(...)