Dlaczego ten kod nie rzuca ConcurrentModificationException
? Modyfikuje on kod Collection
podczas iteracji przez niego, bez użycia metody Iterator.remove()
, która ma być the only safe way of removing.Dlaczego ten kod nie generuje wyjątku ConcurrentModificationException?
List<String> strings = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String string : strings)
if ("B".equals(string))
strings.remove("B");
System.out.println(strings);
uzyskać ten sam wynik, czy mogę wymienić ArrayList
z LinkedList
. Jednak jeśli zmienię listę na ("A", "B", "C", "D)
lub po prostu ("A", "B")
otrzymam wyjątek zgodnie z oczekiwaniami. Co się dzieje? Używam jdk1.8.0_25
, jeśli jest to istotne.
EDIT
Znalazłem poniższy link
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4902078
Odpowiednia sekcja jest
Naiwny rozwiązaniem jest dodanie do kontroli komodyfikacja hasNext w AbstractList, ale to podwaja koszty sprawdzania kompryfikacji. Okazuje się, że wystarczy wykonać test tylko w ostatniej iteracji , która praktycznie nie zwiększa kosztów. Innymi słowy, Obecna implementacja hasNext:
public boolean hasNext() { return nextIndex() < size; }
Czy zastąpione niniejszym realizacji:
public boolean hasNext() { if (cursor != size()) return true; checkForComodification(); return false; }
Zmiana ta nie zostanie wykonana, ponieważ Słońce wewnętrzny organ regulacyjny odrzucił. Formalne orzeczenie wskazało, że zmiana "ma wartość wykazała potencjał znacznego wpływu na kompatybilność na istniejący kod." („Oddziaływania zgodność” jest to, że poprawka ma potencjał, aby zastąpić cichą wybryków z ConcurrentModificationException.)
Ponieważ 'ConcurrentModificationException' jest wyrzucane na "best-effort" Basis –
Możliwy duplikat: [java.util.ConcurrentModificationException nie wyrzucony, gdy spodziewane] (http://stackoverflow.com/questions/ 24980651/java-util-concurrentmodificationexception-not-throw-when-expected) – Pshemo
Uwielbiam, w jaki sposób Sun nie wprowadził zmiany, może spowodować, że jakiś zły kod zacznie rzucać wyjątek, który miałby wyrzucić – Mshnik