ListIterator выдает «Исключение в потоке» main «java .util.ConcurrentModificationException» Java - PullRequest
0 голосов
/ 07 февраля 2020

Я немного искал в Интернете, но либо объяснения мне не нравятся, либо люди действительно предлагают использовать ArrayList, чтобы избежать исключения ... Так что я сейчас немного беспомощен. Это мой код:

import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Scanner;

public class ArrayIterator {

    static Scanner scan = new Scanner(System.in);
    static ArrayList<String> simpleList = new ArrayList<>();
    static ListIterator<String> simpleIterator = simpleList.listIterator(0);
    static int b = 5;

    public static void main(String[] args) {

        getInput();
        spellOutput();

    }
    private static void getInput(){
        System.out.println("What do you want to add to your list? You can name five items");
        for (int i = 0; i < b; i++) {
            String m = scan.nextLine();
            simpleList.add(m);
        }
    }
    private static void spellOutput(){
        System.out.println("Here are the items from your list: ");
        do{
            System.out.println(simpleIterator.next());
        }while(simpleIterator.hasNext());
    }
}

В методе getInput все работает нормально, и я могу легко вывести ArrayList через System.out.println();. Однако, когда я использую метод spellOut, вещи go юг, и я получаю следующее исключение:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1009)
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:963)
    at ArrayIterator.spellOutput(ArrayIterator.java:28)
    at ArrayIterator.main(ArrayIterator.java:15)

Любая помощь будет принята с благодарностью :)

Ответы [ 3 ]

0 голосов
/ 07 февраля 2020

Проблема в том, что итератор создается до вызова getInput ().

Здесь итератор создается из пустого списка. Запрещается структурно изменять (добавлять или удалять элементы) коллекцию во время итерации (поиск итератора при сбое).

Решение - переместить создание итератора в spellOutput ().

0 голосов
/ 07 февраля 2020

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

Например,

 List<String> list = Arrays.asList("yes", "no", "maybe");
 for(String string : list) { //operation 1 - list iteration
     list.add("definitely not"); //operation 2 - add to list -- will throw concurrent modification exception because operation 1 is still pending.
 }

Для вашего Сценарий, чтобы исправить это, удалите

ListIterator<String> simpleIterator

в качестве глобальной переменной и инициализируйте ее после добавления элементов в список со сканера.

private static void spellOutput() {
    ListIterator<String> simpleIterator = simpleList.listIterator(0);
    System.out.println("Here are the items from your list: ");
    do {
        System.out.println(simpleIterator.next());
    } while(simpleIterator.hasNext());
}

И вот вам go, больше нет исключений одновременной модификации

0 голосов
/ 07 февраля 2020
  1. Вы создали итератор.
  2. Вы изменили список.
  3. Вы использовали итератор.

Именно поэтому возникло параллельное исключение. Чтобы исключение не создавалось, вы должны добавлять элементы в список только с помощью итератора:

simpleIterator.add(m)
...