Metoda remove(int)
na List
usuwa element w określonej pozycji. Przed rozpoczęciem pętli, lista wygląda następująco:
[1, 2]
Wtedy zaczynasz iterator na liście:
[1, 2]
^
Twój for
pętla następnie usuwa elementu w pozycji 1, który jest numer 2:
[1]
^
iterator, na kolejnej domniemanej hasNext()
rozmowy zwraca false
, a pętla zostaje zakończona.
Otrzymasz ConcurrentModificationException
, jeśli dodasz więcej elementów do listy. Wtedy zostanie wyrzucony niejawny next()
.
Jako notatkę, z Javadoc dla ArrayList
od FKŻ:
Uwaga że nie szybki zachowanie iteratora nie może być zagwarantowane, jak to jest, ogólnie rzecz biorąc, niemożliwe, aby jakiekolwiek twarde gwarancje obecność niezsynchronizowanej równoczesnej modyfikacji. Fail-szybkie iteratory rzucać ConcurrentModificationException
na zasadzie najlepszego wysiłku. Dlatego błędem byłoby napisanie programu, który zależałby od tego wyjątku pod względem poprawności: szybkie działanie iteratorów powinno być używane tylko do wykrywania błędów.
Jest to prawdopodobnie błąd w implementacji iteratora Oracle ArrayList
; hasNext()
robi nie czek na modyfikacji:
public boolean hasNext() {
return cursor != size;
}
Po co ten błąd? [ArrayList.remove()] (http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#remove (int)) nie wyrzuca tego błędu, tylko indeks z miedza. – SyntaxTerror
psssst! .... nigdy nie widziałem mojej odpowiedzi na pytanie :) –
możliwy duplikat [usunięcia obiektu z tablicy listy za pomocą wyjątków foreach tylko wtedy, gdy rozmiar listy przekracza 2] (http://stackoverflow.com/questions/20040015/remove-object-from-arraylist-using-foreach-exception-occours-only-when-the-lis) – vandale