2016-11-28 16 views
0

私はこの練習問題を抱えていましたが、私はコードをコンパイルするときに並行変更エラーが発生し続ける理由を理解するのに苦労しています。コードをコンパイルするときに並行変更の例外が発生する

「リストは、パラメータ タイトルと一致するタイトルの映画が含まれている場合、それは、長さやジャンルのアップデート。一致が 新しいフィルムを作成し、リストに追加見つからない場合。」

タイトルに一致するかどうかを確認することはできましたが、1つもない場合は、新しいフィルムをアレイに追加できませんでした。私が書いたコードは次のとおりです。

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

関連する問題