2011-11-11 2 views
3

J'ai écrit le code suivant qui entraîne une exception de modification simultanée. Comment puis-je l'empêcher? L'idée est d'échapper à toutes les valeurs de la carte et de reconstruire l'objet (dO) avec une nouvelle carte param.Exception de modification simultanée 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()); 

// S'il vous plaît noter que le paramètre est un hashmap, est-il nécessaire pour supprimer l'entrée avant d'insérer ou il remplacera la nouvelle valeur associée à la clé. Comment ça marche en Java?

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

Répondre

12

l'exception est levée parce que vous ajoutez/enlever des choses de la carte pendant que vous itérez il:

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

vous devez utiliser iterator.remove() à la place.

0

Vous n'êtes pas sûr de devoir modifier les clés de Map, il semble que tout ce que vous voulez faire est de modifier les valeurs dans les tableaux.

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

Je veillerais la carte n'ont null valeurs stockées. Mais si vous ne pouvez pas changer cela, vous devrez ajouter if(values != null)

0

Vous ne devez supprimer/ajouter que si vous modifiez une clé dans une carte. Comme je le vois dans le code, vous changez seulement la valeur. Par conséquent, vous pouvez utiliser entry.setValue(...) à la place.

Questions connexes