2010-11-27 4 views
6

Ich bekomme diesen Fehler jedes Mal, wenn meine Beobachter durchlaufen werden.GWT App bekommen java.util.ConcurrentModificationException von MVC Muster

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

GWT hat keine Threads, daher ist es kein Synchronisationsproblem.

Es scheint zu passieren, nachdem ich einen Knopf drücken, irgendwelche Ideen, wie Sie diesen Fehler vermeiden?

Antwort

10

Vom javadoc von ConcurrentModificationException:

Beachten Sie, dass diese Ausnahme zeigt nicht immer, dass ein Objekt durch einen verschiedenen Thread gleichzeitig modifiziert wurde. Wenn ein einzelner Thread eine Sequenz von Methodenaufrufen ausgibt, die den Vertrag eines Objekts verletzen, kann das Objekt diese Ausnahme auslösen. Wenn ein Thread beispielsweise eine Auflistung direkt ändert, während er die Auflistung mit einem Fail-Fast-Iterator wiederholt, löst der Iterator diese Ausnahme aus.

Also in Ihrem Fall scheint es, dass o.notify(model) ändert this.observers - direkt oder indirekt. Dies ist ein häufiges Phänomen beim Ändern der Sammlung, über die Sie iterieren.

gleichzeitige Änderung zu vermeiden, können Sie auf eine Kopie der Sammlung wie folgt funktionieren:

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

    o.notify(model); 
} 

jedoch manchmal nicht das, was Sie wollen - das aktuelle Verhalten von o.notify auch einen Fehler hinweisen könnte.

+0

Das hat das Problem behoben, danke. – jax