#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);