Archive for the ‘The geek way of life’ Category
java.util.ConcurrentModificationException
Probleme rencontre ce matin en Java 5 (Tiger):
[java]
Vector toto = new Vector();
// ...remplissage du vecteur...
for (Object o : toto){
toto.remove(o);
}
Cela leve une exception de type:
java.util.ConcurrentModificationException
Au debut j’ai pense a un probleme de synchronisation, et donc j’ai ajoute un bloc synchronized(mutex){...}
, mais cela n’a pas fonctionne.
Mais en fait le probleme est different: apparemment cela vient de la facon dont le “foreach” a la Java gere le parcours des elements d’un vecteur (ou de tout autre objet iterable).
La solution que j’ai trouvee consiste a utiliser un “for” classique, qui fonctionne:
[java]
for (int i=0; i<toto.size(); i++){
Object o = toto.elementAt(i);
remove(o);
}
(je n’ai meme pas tente un remove(i)
, pour eviter les effets de bord sur les indices)
Neanmoins ce n’est pas ce qu’il y a de mieux, il aurait fallu utiliser un vrai Iterator
, mais pour etre franc j’avais legerement la flemme…