java.util.Ошибка исключения ConcurrentModificationException

#java #exception #arraylist

#java #исключение #список массивов

Вопрос:

я пытаюсь создать java-приложение с графическим интерфейсом. я пишу код, в котором хочу разрешить Пользователю изменять некоторые данные и сохранять эти изменения в текстовом файле. Прежде чем сделать это, я хочу удалить старые данные, которые были изменены, из списка, а затем переписать новые данные с последним изменением.если я пропустил какое-либо занятие, которое вы хотели посмотреть, пожалуйста, скажите мне, я выложу его онлайн как можно быстрее

это мой

     public void saveChanges(footBall Player, String name, String level,
        int[] scores, int footSize) {

    try {
        if (CompetitorsList.size() != 0) {
            for (Competitors C : CompetitorsList) {

                if (C instanceof footBall) {
                    String Number = Player.playerNumber   "";
                    if (C.getPlayerNumberAsString().equals(Number)) {
                        System.out.println("c");

 //the error hit me here when i try to remove the object from the list the exception error is       java.util.ConcurrentModificationException 
                        CompetitorsList.remove(C);

                    }

                }
            }

            Name NewName = new Name(name);
            System.out.println("Please get in2");
            footBall NewPlayer = new footBall(Player.playerNumber, scores,
                    level, footSize, NewName);

            CompetitorsList.add(NewPlayer);

            SaveOnFile();
        } else {
            System.out.println("No List");
        }

    } catch (Exception ex) {
        System.out.print("testing4");
        System.out.print("something wrong"   ex);
    }

}
  

это метод SaveOnFile:
общедоступный файл сохранения void() {

     String scoresInString;
    FileWriter fw;
    try {

        fw = new FileWriter("footBall");

        for (Competitors C : CompetitorsList) {
            if (C instanceof footBall) {
                footBall Scores = new footBall();
                scoresInString = Scores.returnScoreAsString(C.scores);
                fw.write(C.playerNumber   ", "   C.name.getFullName()
                          ", "   C.level   ", "   scoresInString   ","
                          ((footBall) C).footSize()   "n");
                fw.write("rn");
            }

        }

        fw.close();

    }
    // message and stop if file not found
    catch (FileNotFoundException fnf) {
        System.out.println("File not found ");
        System.exit(0);
    }
    // stack trace here because we don't expect to come here
    catch (IOException ioe) {
        ioe.printStackTrace();
        System.exit(1);
    }
}
  

Ответ №1:

Вызов remove() для коллекции делает недействительным весь активный итератор. Вместо этого вы должны использовать метод Iterator.remove():

 for(Iterator<Competitors> it = CompetitorsList.iterator(); it.hasNext(); ) {
    Competitors C = it.next();
    if(C instanceof ...) {
        if(C.getPlayerNumberAsString().equals(Number))
            it.remove();
    ...
  

Таким образом, iterator () знает о том, как изменяется коллекция, что в противном случае было бы невозможно, поскольку ArrayList не отслеживает созданные им итераторы.

Комментарии:

1. Спасибо за быстрое воспроизведение, у меня есть еще один вопрос, с которым вы могли бы мне помочь. в файле записи есть пробелы, которые мне не нужны, есть ли способ контролировать это??

Ответ №2:

В качестве альтернативы, если вы хотите использовать тот же синтаксис «for-next» и не изменять синтаксис итератора, соберите все удаляемые объекты во временную коллекцию. например

 ArrayList<Competitors> removeThese = new ArrayList<Competitors>();
for (Competitors C : CompetitorsList) {
   if (wantToRemove(C))  // your number logic goes here...
      removeThese.add(C);
}
CompetitorsList.removeAll(removeThese);