2011-04-26 1 views
4
Exception in thread "main" java.util.ConcurrentModificationException 
Squash the PC dirties the room Violet. The room's state is now dirty 
Lily the animal growls 
The Animal Lily left the room and goes to Green through the west door. 
     at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793) 
     at java.util.HashMap$KeyIterator.next(HashMap.java:828) 
     at homework5.Room.critReactRoomStateChange(Room.java:76) 
     at homework5.PC.play(PC.java:121) 
     at homework5.Main.main(Main.java:41) 
Java Result: 1 

C'est l'erreur que je reçois.ConcurrentModificationException (Java)

Ma méthode ressemble

public void critReactRoomStateChange(String command, PC pc) { 
    Creature temp = null; 
    Iterator iterator = getCreatures().keySet().iterator(); 
    while (iterator.hasNext()) { 
     String names = iterator.next().toString(); 
     if (!(getCreatures().get(names) instanceof PC)) { 
      temp = getCreatures().get(names); 
      if (temp != null) { 
       temp.reactStateChange(command, pc); 
       temp.checkNewRoom(); 
      } 
     } 
    } 
} 

Donc ce que je comprends est que cela signifie que je change la taille de la iterator avant qu'il ne soit terminé, ce qui est l'erreur que vous obtenez. Cela est vrai car l'un des reactionnStateChange est pour qu'un objet soit retiré du hashMap. Comment puis-je le faire en toute sécurité de sorte que lorsque je supprime quelque chose, il laisse l'Iterator savoir à l'avance afin que je puisse éviter cette erreur. Merci d'avance. Si plus de détails sont nécessaires, je serais heureux de répondre à vos demandes.

+1

comme commentaire sur le côté: les appels à 'getCreatures(). Get (...)' ne sont pas nécessaires. vous avez déjà l'objet que vous obtenez. c'est ce que 'iterator.next()' renvoie ... – subsub

+0

Copie possible de [Itérer à travers une collection, évitant ConcurrentModificationException lors de la suppression dans la boucle] (http://stackoverflow.com/questions/223918/iterating-through-a- collection-avoiding-concurrmodificationexception-when-re) – Raedwald

Répondre

8

Le seul moyen sûr de supprimer un élément d'une collection sous-jacente et de poursuivre l'itération consiste à utiliser la méthode remove() du Iterator. Cela supprime le dernier élément renvoyé par la méthode next() du Iterator.

Dans votre cas, il semble que cela nécessite de passer le Iterator à la méthode qui effectue la modification (ou en faire un champ d'instance, comme l'objet Map est déjà).

+0

Ah, en attendant la réponse, j'ai eu l'idée de chercher Iterator dans l'API et j'ai trouvé ce que vous venez de me dire. Je me sens un peu idiot de demander maintenant. Merci comme vous m'avez aidé parce que je mettais la suppression après au lieu d'avant et je recevais toujours l'erreur. lol tyty –

1

Vous le supprimez à l'aide de iterator.remove().

1

Une autre option consiste à utiliser ConcurrentHashMap qui n'a pas ce problème. Vous pouvez l'utiliser comme remplacement et vous n'avez pas besoin de changer le reste du code.

+0

Hé, je regarde ça mais ça ne me laissera pas le créer. dit ne peut pas trouver le symbole que j'ai essayé d'importer mais peut-être que j'utilise le mauvais? –

+2

nvm Je l'ai trouvé c'est import java.util.concurrent.ConcurrentHashMap; –

Questions connexes