2017-03-11 6 views
0

私は反復処理のループ処理に問題があります。私はループを作ろうとする度にConcurrentModificationExceptionをスローし続けました。私がやろうとしているのは、JFreeChart GUIのデータベースからの入力データを表示することです。私はこれを何時間も働いてきました。私はほとんど似たいくつかの質問を見たが、鉱山は異なり、ここではMySQLデータベースからループイテレータJava throw ConcurrentModificationException

をだ表示している私のコードの一部です:

public static ArrayList<String> s = new <String> ArrayList() ; 
    public static ArrayList<Double> d = new <Double> ArrayList() ; 
    public static Iterator op1 = s.iterator(); 
    public static Iterator op2 = d.iterator(); 

DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
    while(op1.hasNext()){ 
    Object a= op1.next(); 
    Object b= op2.next(); 
    String c = (String) a; 
    double d = (double) a; 
    dataset.addValue(d , speed , c); 
    } 
+0

'op1'と' op2'がどこに定義されているか教えてください。 – Gooz

+0

はコンテンツを更新しました –

+0

これ以上のデータが必要です:スタック例外。表示されたコードには、空のリストに対する反復子があります。 hasNext()はtrueを返しません。 – efekctive

答えて

1

は(静的)フィールドにイテレータを入れないでください。

イテレータは、何かをリストに入れる前に作成されます。これらのイテレータはリストに何かを入れた後に失敗します。

次は、単純に、これを再作成:

List<String> list = new ArrayList<>(); 
Iterator<String> it = list.iterator(); 
list.add(""); 
it.next(); // Concurrent modification exception 

反復子を追加した後に作成されている場合は、同じ問題を得ることはありません。これを確認するには、Iterator<String> it = list.iterator();list.add("");行を逆にしてみてください。

基本的に、要素の追加や削除などの構造変更が発生すると、イテレータは無効になります。

ループの直前、ループの直前にイテレータを作成します。

DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
Iterator<String> op1 = s.iterator(); // Don't use raw types. 
// Same for other iterator. 
while(op1.hasNext()){ 
    String c = op1.next(); 

また、例えば(反復中別のスレッドによって変更)真に同時変更を回避するための手順を取る必要があるかもしれませんリストを変更して反復している間はリストに排他的にアクセスできます。

+0

ありがとうございます!私がコードに変更を加えたのは、イテレータの位置を修正し、public static修飾子を削除することです。私はIteratorがどのように動作するかを少し理解していると思う –

関連する問題