2010-11-27 2 views
6

Je reçois cette erreur chaque fois que mes observateurs sont traversés. GWT n'a pas de threads, ce n'est donc pas un problème de synchronisation.L'application GWT obtient java.util.ConcurrentModificationException du modèle MVC

@Override 
public void notifyObservers(ModelViewInterface model) { 
    for(Observer<ModelViewInterface> o : this.observers) 
     o.notify(model); 
} 

Il semble se passer après que j'appuie sur un bouton, des idées sur la façon d'éviter cette erreur?

Répondre

10

De la javadoc de ConcurrentModificationException:

Notez que cette exception ne signifie pas toujours qu'un objet a été modifié simultanément par un autre fil . Si un seul thread émet une séquence d'invocations de méthode qui enfreint le contrat d'un objet, l'objet peut lancer cette exception. Par exemple, si un thread modifie directement une collection pendant qu'il itère sur la collection avec un itérateur fail-fast, l'itérateur lancera cette exception.

Donc dans votre cas, il semble que o.notify(model) modifie this.observers - directement ou indirectement. C'est un phénomène courant lorsque vous modifiez la collection sur laquelle vous itérez.

Pour éviter une modification concurrente, vous pouvez utiliser sur une copie de la collection comme ceci:

for(Observer<ModelViewInterface> o : 
      new ArrayList<ModelViewInterface>(this.observers)) { 

    o.notify(model); 
} 

Cependant, parfois ce n'est pas ce que vous voulez - le comportement actuel de o.notify pourrait également indiquer un bug.

+0

Cela a résolu le problème, merci. – jax