编译代码时并发修改异常,
Concurrent Modification exception when i compile my code,
有人要求我做这个练习,但我很难理解为什么我在编译代码时总是出现并发修改错误。
"If the list contains a film with a title that matches the parameter
title then update it's length and genre. If no match is found create a
new film and add it to the list."
我已经设法检查是否有匹配的标题,但是如果没有,我就无法成功地将新电影添加到我的阵列中。这是我写的代码:
public void updateLengthAndGenre(String title, int length, String genre) {
ArrayList<Film> output = new ArrayList<>();
boolean found = false;
for (Film film : films) {
if (film.getTitle().equals(title)) {
found = true;
film.setGenre(genre);
film.setLength(length);
}
}
for (Film film : films) {
if (!found) {
films.add(new Film(title, length, genre));
}
}
}
谁能解释为什么我总是收到这个错误,并给我一些补救建议?
你得到这个exceotion的原因是因为你试图在迭代它的同时添加到一个集合中。你不能做这个。在你的情况下,你似乎根本不需要这样做。
public void updateLengthAndGenre(String title, int length, String genre) {
ArrayList<Film> output = new ArrayList<>();
for (Film film : films) {
if (film.getTitle().equals(title)) {
film.setGenre(genre);
film.setLength(length);
return;
}
}
films.add(new Film(title, length, genre)); // synchronize if you're multithreading
}
这个是一样的效果。如果您绝对需要在迭代时添加到集合中,您可以使用 java.util.ListIterator
.
ListIterator<Film> filmIter = films.listIterator();
while(filmIter.hasNext()){
if( /* some condition */){
fillmIter.add(new Film(title, length, genre));
}
filmIter.next(); // example only.
}
有人要求我做这个练习,但我很难理解为什么我在编译代码时总是出现并发修改错误。
"If the list contains a film with a title that matches the parameter title then update it's length and genre. If no match is found create a new film and add it to the list."
我已经设法检查是否有匹配的标题,但是如果没有,我就无法成功地将新电影添加到我的阵列中。这是我写的代码:
public void updateLengthAndGenre(String title, int length, String genre) {
ArrayList<Film> output = new ArrayList<>();
boolean found = false;
for (Film film : films) {
if (film.getTitle().equals(title)) {
found = true;
film.setGenre(genre);
film.setLength(length);
}
}
for (Film film : films) {
if (!found) {
films.add(new Film(title, length, genre));
}
}
}
谁能解释为什么我总是收到这个错误,并给我一些补救建议?
你得到这个exceotion的原因是因为你试图在迭代它的同时添加到一个集合中。你不能做这个。在你的情况下,你似乎根本不需要这样做。
public void updateLengthAndGenre(String title, int length, String genre) {
ArrayList<Film> output = new ArrayList<>();
for (Film film : films) {
if (film.getTitle().equals(title)) {
film.setGenre(genre);
film.setLength(length);
return;
}
}
films.add(new Film(title, length, genre)); // synchronize if you're multithreading
}
这个是一样的效果。如果您绝对需要在迭代时添加到集合中,您可以使用 java.util.ListIterator
.
ListIterator<Film> filmIter = films.listIterator();
while(filmIter.hasNext()){
if( /* some condition */){
fillmIter.add(new Film(title, length, genre));
}
filmIter.next(); // example only.
}