Я получаю следующее исключение: «java.util.ConcurrentModificationException» - PullRequest
1 голос
/ 21 февраля 2011

Я получаю «Возникла исключительная ситуация: java.util.ConcurrentModificationException», когда я запускаю этот кусок кода.Кто-нибудь здесь видит, в чем проблема?

public void mudaDeEstado() {
    Luz luz = new Luz();
    while(this.iterador.hasNext()) {
        luz = (this.iterador.next());
        luz.defineEstado(!luz.acesa());
    }

}

Большое спасибо !!

Ответы [ 2 ]

7 голосов
/ 21 февраля 2011

Вы пытаетесь изменить ссылку, которую держит итератор при циклическом просмотре элементов.Вы можете прочитать больше о его исключении здесь .

Например, как правило, один поток не может изменять коллекцию, пока другой поток итерирует по ней.В общем, результаты итерации в этих обстоятельствах не определены.Некоторые реализации Iterator (включая реализации всех реализаций коллекций общего назначения, предоставляемых JRE) могут выбрасывать это исключение, если обнаруживается такое поведение.Итераторы, которые делают это, называются итераторами с быстрым отказом, так как они быстро и чисто терпят неудачу, а не рискуют произвольным, недетерминированным поведением в неопределенное время в будущем.

Скорее всего, виновник здесьэто:

luz.defineEstado(!luz.acesa());
1 голос
/ 21 февраля 2011

Это исключение выдается, когда вы изменяете структуру данных во время итерации по ней. Изменение элементов в структуре данных может изменить способ итерации элементов, поэтому многие структуры данных не допускают одновременного изменения.

Попробуйте сохранить список элементов, которые необходимо обновить, а затем вернитесь и обновите эти элементы, как только вы выполните итерацию по всей структуре данных.

Извините, моя формулировка носит общий и двусмысленный характер, но с приведенным кодом трудно дать конкретику.

...