2012-01-27 2 views
-1

Следующий фрагмент кода генерирует исключение ConcurrentModificationException почти каждый раз, когда он вызывается. Вторая часть кода не генерирует исключение, однако мне не нужна правильная логика. Если объект является экземпляром EditorFrame, мне нужно вызвать стратегию удаления, которая является методом close(). Однако, если это всего лишь базовый фрейм, я хочу, чтобы он вызывал dispose().Java - ConcurrentModificationException

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

Код, который бросает исключение:

synchronized (frameList) { 
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) { 
     JFrame frame = it.next(); 
     if (frame instanceof EditorFrame) ((EditorFrame) frame).close(); 
     else frame.dispose(); 
     it.remove(); 
    } 
} 

Этот код работает, но это не то, что я хочу:

synchronized (frameList) { 
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) { 
     JFrame frame = it.next(); 
     frame.dispose(); 
     it.remove(); 
    } 
} 

Спасибо за помощь!

+5

Вы модифицируете 'EditorFrame.close' метод' frameList'? (Текущий поток будет удерживать блокировку на 'frameList'. Заблокировки возвращаются. Не требуется блокировка, так как Swing следует использовать только из потока диспетчеризации событий (EDT).) –

+0

Не могли бы вы опубликовать класс EditorFrame? –

+0

Согласитесь с Томом Хоутином: вы должны делать только этот код в одном потоке, EDT, и поэтому не нужно синхронизировать. Какая строка, кстати, вызывает исключение? Кроме того, все блоки if/else, для циклов, снимать любой блок кода должны быть заключены в фигурные скобки, чтобы избежать двусмысленности. –

ответ

6

Не вдаваясь в то, что вызывает исключение ConcurrentModificationException. вы все равно удаляете каждый объект из frameList

Почему вы не очищаете список явно после завершения итерации списка.

synchronized (frameList) { 
    for (JFrame frame : frameList) { 
     if (frame instanceof EditorFrame) ((EditorFrame) frame).close(); 
     else frame.dispose(); 
    } 
    frameList.clear(); 
} 
Смежные вопросы