SORU
18 Kasım 2011, Cuma


java.açıklama.ConcurrentModificationException

NOT: Iterator#remove() yöntemi farkındayım.

Aşağıdaki kod örneği, List.remove main yöntemi ConcurrentModificationException atar ama remove yöntemi değil neden anlamıyorum.

public class RemoveListElementDemo {    
    private static final List<Integer> integerList;

    static {
        integerList = new ArrayList<Integer>();
        integerList.add(1);
        integerList.add(2);
        integerList.add(3);
    }

    public static void remove(Integer remove) {
        for(Integer integer : integerList) {
            if(integer.equals(remove)) {                
                integerList.remove(integer);
            }
        }
    }

    public static void main(String... args) {                
        remove(Integer.valueOf(2));

        Integer remove = Integer.valueOf(3);
        for(Integer integer : integerList) {
            if(integer.equals(remove)) {                
                integerList.remove(integer);
            }
        }
    }
}

Açıklama için teşekkürler!

CEVAP
18 Kasım 2011, Cuma


İşte bu yüzden: Böyle diyor Javadoc:

Bu yineleyicisi bu sınıf tarafından döndürülen yineleyici ve listİterator. eğer listede herhangi bir yapısal olarak değiştirilirse-hızlı başarısız yöntemleri: zaman yineleyici, herhangi bir şekilde dışında oluşturulduktan sonra yineleyici kendi Kaldır veya Ekle, yineleyici bir atar yöntemleri ConcurrentModificationException.

Bu onay yineleyici next() yöntemi stacktrace görebileceğiniz gibi) yapılır. Ama her tarafından eğer sınır bir araya geldi olup olmadığını kontrol etmek için ne denir ki, eğer hasNext() doğru teslim eğer sadece next() yöntemi ulaşacağız,. Senin çıkarın yöntemi, hasNext() denetler, ihtiyacı dönmek başka bir unsur olacaktır emin olmak için geri döndü iki öğe, şimdi ve sonra bir öğe kaldırıldı listesini sadece iki unsurları içerir. Yani her şey yolunda ve yineleme ile işimiz bitti. Eşzamanlı değişiklikler için onay bu asla denir next() yöntemi farklı olduğu için oluşmaz.

Sonraki ikinci döngü. Biz hasNext metodu tekrar kontrol edecek ikinci numarası varsa Kaldır sonra geri dönebilirsiniz daha fazla değer. Zaten iki değer döndü, ama liste şimdi sadece içerir. Ama kodu burada:

public boolean hasNext() {
        return cursor != size();
}

1 != 2, Şimdi birisi listesi kurcalıyordu olduğunu fark eder ve bu durum harekete next() yöntemi, devam ediyoruz.

Sorunun düzelir umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • colacas

    colacas

    29 EKİM 2006
  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011
  • Crossover

    Crossover

    18 HAZİRAN 2007