Проблемы с ListIterator и Исключением параллельной модификации - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть два ArrayList, каждый из которых содержит блоки определенного размера: blockList, eraserList. Блоки - это объекты с двумя полями: начало и конец. Мне нужно вычесть один набор блоков из другого набора блоков.

Я должен пройти по списку eraserList и «стереть» блоки из blockList, где они перекрываются. Таким образом, мой код выглядит так:

 void eraseBlocks (Arrylist<Blocks> blockList, ArrayList<Blocks> eraserList) {
    ListIterator<Blocks> it = blockList.listIterator();

    for (Blocks eraser: eraserList) {
        while (it.hasNext()) {
            Blocks block= it.next();
            if ((eraser.start <= block.start) && (eraser.end >= block.end))
                 blockList.remove(block);
            else if ((eraser.start <= block.start) && (eraser.end < block.end)){
                 block.set(start, eraser.end);
            else if () {
                        ...
                 //more code for where the eraser partially erases the beginning, end, or splits the block
                 //if statements call the .add(), .set(), and remove() methods on the blockList.
                        ...
                  }
            }
        }

Я не понимаю, почему я получаю исключение для одновременной модификации. Я никогда не изменяю eraserList.

Я пытаюсь изменить объект блока, который назначен в «Блок блок = it.next ();» заявление. Я также изменяю blockList, удаляя или добавляя блоки в список. Я думал, что весь смысл ListIterator в том, что он позволяет вам изменять, добавлять или вычитать список, по которому вы проходите.

Трассировка отказов указывает на ластик Blocks = it.next (); как линия, рисующая исключение, но я не знаю, что это говорит мне.

Может кто-нибудь помочь мне понять, что я делаю не так?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 24 февраля 2012

Да, ListIterator предназначен для разрешения изменения списка.Но вы не используете метод remove () ListIterator, а непосредственно управляете самим базовым списком.

0 голосов
/ 24 февраля 2012

Вам необходимо позвонить remove() на Iterator, а не на List.

Из Javadoc:

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

0 голосов
/ 24 февраля 2012

Заменить

blockList.remove(block);

с

it.remove();

Если вы удалите элемент другим способом, вы можете получить CME.

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