2016-11-28 6 views
0

Мне было дано это упражнение, и я боюсь понять, почему я продолжаю получать ошибку одновременной модификации при компиляции моего кода.Исключение параллельной модификации при компиляции моего кода,

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

Мне удалось проверить, есть ли совпадение для названия, однако, когда его нет, я не могу успешно добавить новый фильм в свой массив. Вот код, который я написал:

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

Может кто-то объяснить, почему я получаю эту ошибку, а также дать мне несколько советов, как исправить это?

ответ

2

Причина, по которой вы получаете это исключение, заключается в том, что вы пытаетесь одновременно добавить в коллекцию, итерации по ней. Ты не сможешь это сделать. В вашем случае, похоже, вам вообще не нужно делать это вообще.

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. 
} 
+0

Спасибо, что оба предложения работали. – Peter