2010-11-27 13 views
6

Recibo este error cada vez que mis Observadores son atravesados.aplicación GWT obteniendo java.util.ConcurrentModificationException del patrón MVC

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

GWT no tiene hilos, por lo que no es un problema de sincronización.

Parece suceder después de presionar un botón, ¿alguna idea de cómo evitar este error?

Respuesta

10

Desde el javadoc de ConcurrentModificationException:

Tenga en cuenta que esta excepción no siempre indica que un objeto ha sido modificado al mismo tiempo por un hilo diferente. Si un único hilo emite una secuencia de invocaciones de métodos que viola el contrato de un objeto, el objeto puede arrojar esta excepción. Por ejemplo, si un hilo modifica una colección directamente mientras itera sobre la colección con un iterador de fail-fast, el iterador aplicará esta excepción.

Así, en su caso, parece que o.notify(model) modifica this.observers - directa o indirectamente. Este es un fenómeno común al modificar la colección sobre la que está iterando.

Para evitar la modificación concurrente, puede operar sobre una copia de la colección de esta manera:

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

    o.notify(model); 
} 

Sin embargo, a veces esto no es lo que quiere - el comportamiento actual de o.notify también podría indicar un error.

+0

Eso solucionó el problema, gracias. – jax

Cuestiones relacionadas