GWT-приложение получает java.util.ConcurrentModificationException из шаблона MVC - PullRequest
6 голосов
/ 27 ноября 2010

Я получаю эту ошибку каждый раз, когда меня посещают Наблюдатели.

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

GWT не имеет потоков, поэтому это не проблема синхронизации.

Похоже, что после нажатия кнопки есть идеи, как избежать этой ошибки?

1 Ответ

10 голосов
/ 27 ноября 2010

Из javadoc ConcurrentModificationException :

Обратите внимание, что это исключение не всегда означает, что объект одновременно был изменен потоком , отличным от .Если один поток выдает последовательность вызовов методов, которая нарушает контракт объекта, объект может вызвать это исключение.Например, если поток изменяет коллекцию напрямую, в то время как он выполняет итерацию по коллекции с помощью итератора с быстрой ошибкой, итератор сгенерирует это исключение.

Так что в вашем случае кажется, что o.notify(model) изменяет this.observers - прямо или косвенно.Это обычное явление при изменении коллекции, для которой вы выполняете итерацию.

Чтобы избежать одновременного изменения, вы можете работать с копией коллекции следующим образом:

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

    o.notify(model);
}

Однако иногдаэто не то, что вам нужно - текущее поведение o.notify также может указывать на ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...