2013-03-11 3 views
0

Je me fais ConcurrentModificationException lorsque vous parcourez un contenu d'une carteConcurrentModificationException lorsque vous parcourez la carte

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

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

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

sMap.getContent() retours Map<String, List<String>>, dont je reçois seulement les clés.

Notez qu'aucune modification du contenu de la carte n'est effectuée. Je ne fais qu'itérer ici.

Qu'est-ce que je fais mal ici? Comment puis-je corriger la situation lorsque l'exception est levée?

+4

Vous devez envoyer les entrailles de votre boucle, comme cela est probablement où l'exception vient de – jbabey

+0

je suggère la construction d'un [sscce] (http: // sscce. org). Vous trouverez probablement quelque chose que vous ne pouvez pas supprimer de votre programme sans faire disparaître l'exception. Regardez de très près ce morceau de code. –

+0

Question mise à jour pour inclure quelques lignes de plus – JAM

Répondre

2

Cela se produira si la collection sous-jacente qui est en cours d'itération est modifiée par autre chose que l'Iterator lui-même.

Essayez d'utiliser un ConcurrentHashMap au lieu d'un simple HashMap

+0

Réécriture à l'aide de l'itérateur. Tout fonctionne. Merci – JAM

+0

@Jam c'est un peu déconcertant parce que cela n'aurait pas dû faire la différence. 'sMap.getContent(). keySet()' créera simplement un interacteur de l'ensemble de clés retourné par la carte. –

+1

@PSR: Il n'est pas nécessaire d'utiliser un ConcurrentHashMap. Le problème avec ce code est une limitation de la boucle foreach, comme vous pouvez le lire dans le tutoriel Java, qui dit: "Utilisez Iterator à la place de la construction for-each lorsque vous avez besoin de supprimer l'élément en cours. l'itérateur, donc vous ne pouvez pas appeler supprimer. " Lien: http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html –

Questions connexes