GWT应用程序从MVC模式获取java.util.ConcurrentModificationException

jax*_*jax 6 gwt

每次观察者遍历时,我都会收到此错误.

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

GWT没有线程,因此它不是同步问题.

这似乎发生在我按下按钮之后,有关如何避免此错误的任何想法?

Chr*_*her 10

ConcurrentModificationException的javadoc :

请注意,此异常并不总是表示某个对象已被另一个线程同时修改.如果单个线程发出违反对象合同的一系列方法调用,则该对象可能会抛出此异常.例如,如果线程在使用失败快速迭代器迭代集合时直接修改集合,则迭代器将抛出此异常.

所以在你的情况下,它似乎直接或间接地o.notify(model)修改this.observers.这是修改您正在迭代的集合时的常见现象.

为避免并发修改,您可以对集合的副本进行操作,如下所示:

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

    o.notify(model);
}
Run Code Online (Sandbox Code Playgroud)

但是,有时候这不是你想要的 - 当前的行为也o.notify可能表明存在错误.