10
votes

Pourquoi une boucle jette-t-elle une parfaite exception, tandis que l'autre n'est pas?

J'ai rencontré cela en écrivant un programme de vendeur itinérant. Pour une boucle intérieure, j'ai essayé un xxx

mais lors de l'ajout d'un autre point à cette liste a abouti à un ConcurrentModicationException étant lancé.

Cependant, Lorsque j'ai changé la boucle sur xxx

la boucle courut bien sans jeter une exception.

Ax à la fois A pour les boucles, alors pourquoi vous lancez une exception pendant l'autre ne fait pas?


1 commentaires

5 Réponses :


6
votes

Le premier exemple utilise un itérateur, le second ne le fait pas. C'est l'itérateur qui vérifie la modification simultanée.


0 commentaires

2
votes

Le premier code utilise un itérateur afin de modifier la collection n'est pas autorisé. Le deuxième code accède à chaque objet avec x.get (i), donc pas utiliser un itérateur, les modifications sont donc autorisées


0 commentaires

0
votes

Vous ne pouvez pas modifier une liste pendant que vous êtes itération sur celui que vous faites dans le premier exemple. Dans la seconde, vous avez simplement un régulier pour boucle.


0 commentaires

10
votes

Comme d'autres expliquées, l'itérateur détecte des modifications à la collection sous-jacente, et c'est une bonne chose puisqu'il est susceptible de causer un comportement inattendu.

Imaginez ce code sans itérateur qui modifie la collection: < Pré> xxx


1 commentaires

J'ai choisi votre réponse parce que vous avez montré comment les choses pouvaient aller mal lors de l'itération par rapport à l'accès via GET ()



0
votes

Si vous exécutez le code et vous observe que vous constatez que la première itération de la boucle fonctionne bien, mais la deuxième lancée ConcurrentModicationException

Si c'est parce que suivant () méthode vérifie si le nombre des éléments n'a pas changé.

Pour une belle explication, voir http: //javaadami.blogspot. com / 2007/09 / amélioré-for-boucle-and.html


0 commentaires