Javadoc of ConcurrentModificationException lautet wie folgt.
Diese Ausnahme wird ausgelöst, wenn eine Methode, die eine parallele Änderung in einem Objekt erkennt, eine solche Änderung nicht zulässt.
Grundsätzlich wird verwendet, um zuerst fehlzuschlagen, um früh zu versagen und eine Ausnahme auszulösen, wenn sich etwas, das wiederholt, ändert </ b>. Das heißt, eine Ausnahme ist aufgetreten, bevor der iterative Prozess abgeschlossen ist.
Die for-each-Anweisung verwendet Iterator, der nicht sehr redundant ist. Sie können jedoch auf zusätzliche Methoden wie "remove ()" zugreifen, wenn Sie Ihren Test für die Verwendung von Iterator umgestalten. Die Methode remove verursacht keine ConcurrentModificationException, daher ist es in Ordnung, sie während eines iterativen Prozesses aufzurufen.
Bei meinem Code gab es ein Problem mit dem Umgang mit ArrayList. ArrayList und Iterator enthalten intern die "Anzahl der Änderungen". Der von der Iterator () -Methode von ArrayList generierte Iterator prüft, ob beim Starten der next () -Methode usw., die beim Drehen mit for verwendet wird, eine Abweichung vorliegt, und aufgrund einer Abweichung eine Ausnahme von ConcurrentModificationException Trat auf. Es gab die folgende Beschreibung in Javadoc ArrayList.
Der von den Iterator- und ListIterator-Methoden dieser Klasse zurückgegebene Iterator ist ausfallsicher. Nachdem der Iterator erstellt wurde, löst der Iterator eine ConcurrentModificationException aus, wenn die Liste durch eine andere Methode als die Methode remove oder add des Iterators selbst strukturell geändert wird. Auf diese Weise löst der Iterator bei parallelen Änderungen sofort und sauber eine Ausnahme aus, um das Risiko eines unvorhersehbaren Verhaltens an unvorhersehbaren Punkten in der Zukunft zu vermeiden. Im Allgemeinen ist es bei asynchronen parallelen Änderungen nicht möglich, das ausfallsichere Verhalten des Iterators zu garantieren, da keine zuverlässige Garantie gegeben werden kann. Der ausfallsichere Iterator löst eine ConcurrentModificationException aus, die auf dem Best-Effort-Prinzip basiert. Daher ist es ein Fehler, ein Programm zu schreiben, dessen Genauigkeit von dieser Ausnahme abhängt. "Das ausfallsichere Verhalten des Iterators sollte nur zum Erkennen von Fehlern verwendet werden."
Class ConcurrentModificationException Vermeiden Sie ConcurrentModificationException in Java
Recommended Posts