2017-02-24 14 views
-1

オブジェクトの配列を反復処理していますが、オブジェクトを変更しません。 次のエラーが発生するのはなぜですか?説明できないエラー:java.util.ConcurrentModificationException

java.util.ConcurrentModificationExceptionが

コード:

ArrayList<Event> events=HistoryData.getEvents(); 

for (Event event: events) { <----- Getting the error here 
    HistoryDate eventDate = event.getEventDate(); 

    if (eventDate.isGreaterEqualThen(searchDate)) { 
    ActualDate.setDate(event.getEventDate()); 

    break; 
    } 
} 

UPDATE

私はその後、私がハンドラを呼び出す、アレイをロードスレッドを持っていますスレッドの終わり。その時、配列は既にロードされています。 このハンドラでは、コードが示すように配列にアクセスしています。この先行するスレッドは問題ですか?

+0

あなたはマルチスレッドアプリケーションに適していますか? –

+0

完全なコードスニペットを貼り付けますか?...このコードが動作するようです。私はこのコードがどのようにリンクされているかを知る必要があります。 – sitakant

答えて

2

Concurrent Modification同じデータセットが2つの異なる操作によって同時に変更されると、エラーがスローされます。

マルチスレッド時に起こる:何かをバックグラウンドスレッドでは、リストをループを終了する前に、追加、削除したり、リスト内の項目の位置を変更しました

+1

私は、静的メソッド 'HistoryData.getEvents()'によって返されたリストが別のスレッドで変更されていると思います。 – npace

+0

私は、配列を読み込むスレッドを持っていますし、スレッドの最後にハンドラを呼び出します。このハンドラでは、コードが示すように配列にアクセスしています。スレッドは問題ですか? –

2

別のスレッドがあなたのスレッドセーフでないリストにアクセスしていますまたはループ内のリストを変更しようとしているので、次の要素を使用して反復したいときにコードが壊れます。それが別のスレッドであれば、おそらくリストタイプをCopyOnWriteArrayListに変更するか、synchronized文を追加してリストをロックすることができますが、その中のリストは変更しないでください。ループ。

synchronized (events) { 
    for (Event event: events) { 
     HistoryDate eventDate = event.getEventDate(); 

     if (eventDate.isGreaterEqualThen(searchDate)) { 
      ActualDate.setDate(event.getEventDate()); 

      break; 
     } 
    } 
} 
関連する問題