2011-11-11 11 views
3

次のコードを記述しましたが、これにより同時変更例外が発生しています。どうすればそれを防ぐことができますか?この考え方は、Mapのすべての値をエスケープし、新しいparamマップを使ってオブジェクト(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()); 

//パラメータがそうハッシュマップであることに注意してください、それは挿入する前に、最初のエントリを削除するために必要な、またはそれがキーに関連付けられた新しい値に置き換えられますです。どのように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

マップのキーを変更する必要があるかどうかわからない場合は、配列内の値を変更するだけです。

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(...)を使用することができます。