2017-03-08 11 views
1

私はクラス呼び出しの生徒を作成していて、それらをリストに保存したいのですが、イテレータを使ってリストから要素をフェッチしていますが、起こっていると私はここで起こっている例外を解決するカント誰かが私にthis.Thankのための論理的な理由を与えることができれば、それは大きな助けになりますがjava.util.ConcurrentModificationException誰かが私にこの論理的な理由を説明できますか?

import java.awt.List; 
    import java.util.ArrayList; 
    import java.util.Collection; 
    import java.util.Iterator; 
    import java.util.Vector; 
    import java.util.List.*; 

    public class Runs { 

     /** 
     * @param args 
     */ 
     public static void main(String[] args) { 
      // TODO Auto-generated method stub 

      try { 

       // adding student class to list 
       java.util.List list = new ArrayList<Student>(); 
       Student q = new Student("hello", 1); 
       Iterator<Student> l = list.iterator(); 
       list.add(q); 
       // error false in this segment of the code 
       Student op = l.next(); 
       String hhh = op.getnamez(); 
       System.out.println(hhh); 
       System.out.println(op.getnamez()); 

      } catch (Exception e) { 
       System.out.println("" + e); 

      } 

     } 

     public static class Student { 
      // student class 
      public String name; 
      private int age; 

      public Student(String s, int a) { 

       this.name = s; 
       this.age = a; 

      } 

      public String getnamez() { 
       return this.name; 

      } 

     } 

    } 
+1

可能な複製を別のデータ構造を固執する必要があるかもしれませんIterotirを実行しているに同時変更を行いたい場合

コレクション、ConcurrentModificationExceptionをループ内で削除するのを避ける](@stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception-when-re) – Jeremy

答えて

0

をはいライン イテレータリットル= list.iteratorを(移動します); 以下 list.add(q);

あなたはより良いあなたがリストを反復処理していることを反映するために、これはあなたのエラーを修正するだけでなく、コードを変更する必要がありイテレータを取得し、その後リストに

を変更することはできません。

+0

@LordUktharありがとう、それが修正されました:) –

2

のJavaコレクションクラスは、フェイルファストれ、コレクションは、いくつかのスレッドがイテレータを使用してその上に横断している間に、iterator.next()はConcurrentModificationExceptionをスローします変更される場合を意味しています。並行変更例外は、マルチスレッド型およびシングルスレッド型のJavaプログラミング環境の場合に発生する可能性があります。

この例では、一旦list.add(q);行が書き出されると、イテレータのmodCount属性が変更されます。

modCountは、リストサイズが変更された回数を提供します。 modCount値はすべてのiterator.next()コールで使用され、関数checkForComodification()内の変更をチェックします。

したがって、modCountを変更すると、ConcurrentModificationExceptionがスローされます。だから、あなたはまだあなたのリストにどのあなたがリストの代わりにCopyOnWriteArrayListとのように[を反復の

+0

正しい。マルチスレッドのプログラムでも発生する可能性がありますが、私が見たほとんどすべての場合(ここではSO)、単純なシングルスレッドプログラムで問題になっています。例外名の* Concurrent *は、一部の人にとっては少し混乱する可能性があります。 – Kayaman

+0

説明ありがとうございましたmr @mhasan !!!私は本当にそのコードセグメントで何が起こったのか理解しています。 –

関連する問題