java.util.ConcurrentModificationException mit Iterator
Ich wissen, ob würde versuchen, zu entfernen aus der Sammlung Durchlaufen es mit der einfachen Schleife, werde ich immer diese exception: java.util.ConcurrentModificationException
. Aber ich bin mit Iterator und es immer noch erzeugt mir diese Ausnahme. Jede Idee, warum und wie es zu lösen?
HashSet<TableRecord> tableRecords = new HashSet<>();
...
for (Iterator<TableRecord> iterator = tableRecords.iterator(); iterator.hasNext(); ) {
TableRecord record = iterator.next();
if (record.getDependency() == null) {
for (Iterator<TableRecord> dependencyIt = tableRecords.iterator(); dependencyIt.hasNext(); ) {
TableRecord dependency = dependencyIt.next(); //Here is the line which throws this exception
if (dependency.getDependency() != null && dependency.getDependency().getId().equals(record.getId())) {
iterator.remove();
}
}
}
}
InformationsquelleAutor der Frage user2219247 | 2013-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
iterator.remove()
statttableRecords.remove()
Können Sie entfernen von Elementen in einer Liste auf, die Sie Durchlaufen, nur wenn Sie die remove Methode aus dem iterator.
EDIT :
Wenn Sie erstellen einen iterator, es beginnt zu zählen, die Modifikationen, die angewendet wurden, auf die Sammlung. Wenn der iterator erkennt, dass einige änderungen vorgenommen wurden, ohne mit seiner Methode (oder mit einem anderen iterator auf die gleiche Sammlung), es kann keine Garantie mehr, es geht nicht zweimal auf dem gleichen element oder überspringen, so wirft er diese exception
Es bedeutet, dass Sie den code ändern, so dass Sie nur entfernen von Elementen über iterator.entfernen (und mit nur einem iterator)
ODER
machen Sie eine Liste der Elemente zu entfernen, dann entfernen Sie diese, nachdem Sie fertig Durchlaufen.
InformationsquelleAutor der Antwort Arnaud Denoyelle
Werden Sie besser verstehen, mit einem Beispiel unten geschrieben:-
InformationsquelleAutor der Antwort codechefvaibhavkashyap
Den Vertrag für HashSet iterator ist, dass Sie nicht entfernen können, aus dem hashset andere als durch, die spcific iterator ' s remove-Methode. Aus der Perspektive der
dependencyIt
haben Sie entfernt ein Element andere als durch den Aufruf derremove
Methode, so wirft es einConcurrentModificationException
.Scheint es, Sie wollen, um Datensätze zu entfernen von Ihrem hashset, wenn Sie den gleichen Datensatz-id. Wäre es nicht einfacher zu überschreiben Ihre Unterlagen ist
equals
undhashcode
Methoden, um sicherzustellen, dass die Datensätze mit der gleichen id gleich und haben die gleichen hashcode? (wenn das Sinn macht natürlich)InformationsquelleAutor der Antwort assylias
Das Problem ist, dass Sie zwei Iteratoren, die in Umfang, zur gleichen Zeit und Sie "kämpfen" miteinander. Der einfachste Weg, um das Problem zu lösen ist, nur um aus der Patsche helfen, der inneren Schleife, wenn Sie eine übereinstimmung finden:
Java
Iterator
s bestimmt sind, zu "fail fast", wenn Ihre zugrunde liegenden container geändert wird, ohne geändert wurde mit derIterator
. Sie sind mit geschachtelten Iteratoren, so dass jederemove()
Betrieb ausgestellt wird, weil das andere zu werfen, einException
wenn es weiterhin verwendet werden. Aus diesem Grund, wenn Sie brauchen, um ein Problemremove()
sind, dann werden Sie brauchen, um es auf die "äußere" iterator (was Sie tun) und beenden Sie die Verwendung der zweiten iterator danach (was den zusätzlichenbreak
Aussage macht).InformationsquelleAutor der Antwort sigpwned