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

时间:2010-11-27 13:50:35

标签: gwt

每次我的观察员被遍历时,我都会收到此错误。

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

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

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

1 个答案:

答案 0 :(得分:10)

来自ConcurrentModificationException的javadoc:

  

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

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

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

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

    o.notify(model);
}

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