2016-12-06 11 views
1
public static ArrayList<Job> ready = new ArrayList<Job>(); 
...later on.... 
ArrayList<Job> temp = ready; 
for (Iterator<Job> iterator = temp.iterator(); iterator.hasNext();) { 
    Job j = (Job) iterator.next(); 
    if (j.number == number) { 
     ready.remove(j); 
     ready.add(j); 
     system.devices-=devices; 
     j.devices+=devices; 
     iterator.remove(); 
    } 
} 

これはなぜエラーになるのですか?確かに、準備=一時、しかし私は一時的に反復しているし、私は一時的な状態を変更していない。この問題を回避するにはどうすればよいですか?一時リストを使用中にConcurrentModificationExceptionが発生する

+4

リストを反復処理している間にリストを変更しようとしています。 'temp'と' ready'は同じリストです - 変更するともう一方が変わります。 *リストをコピーしたい場合、 'temp = new ArrayList (ready)'を実行することができます。 – khelwood

+2

例外に関する質問を投稿するときは、完全な例外スタックトレースを含め、例外をスローするコード内の行を識別する必要があります。 –

+1

@khelwoodあなたは答えとしてコメントを投稿します。 –

答えて

-2

あなたはそれを反復処理しているときは、代わりに別のリストで

if (j.number == number) { 

の条件を満たし、それらの要素を配置...良いアイデア、要素の追加や削除によって

をリストしていない変更されていますそして、やるtemp.removeAll(c);

1

tempreadyへの変更は、tempのイテレータで見られますreadyへの参照です。あなたが実際にあなたがそれを反復している間にリストを変更しようとしているCollections.copy

ArrayList<Job> temp = new ArrayList<Job>(); 
Collections.copy(temp, ready); 
1

を使用することができます。 tempreadyは同じリストです。一方を変更すると他方が変更されます。 リストをコピーする場合は、temp = new ArrayList<Job>(ready)を使用できます。

0

ルーピング中にコレクションを変更しようとしていますが、この操作はサポートされません。 2つの異なるソリューションがあります。 1-コレクションを別のコレクションにコピーし、コレクションに基づいてループし、別のコレクションを変更するには 2つのベストプラクティスは、次のような同時収集を使用することです。 CopOnWriteArrayList、ConcurrentSkipListMap

関連する問題