Java Concurrent Modification Exception Fehler
Im Spiel mit einigen code für meine college-Kurs und änderte die Methode von
public boolean removeStudent(String studentName)
{
int index = 0;
for (Student student : students)
{
if (studentName.equalsIgnoreCasee(student.getName()))
{
students.remove(index);
return true;
}
index++;
}
return false;
}
Zu:
public void removeStudent(String studentName) throws StudentNotFoundException
{
int index = 0;
for (Student student : students)
{
if (studentName.equalsIgnoreCase(student.getName()))
{
students.remove(index);
}
index++;
}
throw new StudentNotFoundException( "No such student " + studentName);
}
Aber die neue Methode hält, was eine Gleichzeitige Änderung Fehler. Wie bekomme ich Runde das und warum ist es passiert?
- mögliche Duplikate von Verhalten der ConcurrentModificationException
- Dies ist eine der drei häufigsten gestellten Java-Fragen. Müssen Sie verwenden einen iterator und rufen
iterator.remove
. - ändern Sie die Liste während der Iteration über das java collections nicht zulassen. die vollständige Erklärung finden Sie hier
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist, weil Sie weiterhin das Durchlaufen der Liste nach der Durchführung
remove()
.Den Sie gerade Lesen, und das schreiben in die Liste in der gleichen Zeit, bricht den Vertrag mit dem iterator zugrunde, die foreach-Schleife.
Verwenden
Iterator.remove()
Er wird wie folgt beschrieben:
Können Sie
Iterator.hasNext()
zu überprüfen, ob es ein Nächstes element zur Verfügung.foreach
Konstrukt verwendet eine zugrunde liegendeIterator
.In der zweiten Methode, Sie weiter zu iterieren, auch nach dem entfernen ein Element aus der Liste. Dies führt zu der Ausnahme, die Sie sehen. Werfen Sie einen Blick auf diese Aussage, entnommen aus
ConcurrentModificationException
Dokumentation:Dieser Fehler tritt auf, weil Sie versuchen, ändern Sie die Größe einer Sammlung, während Sie Durchlaufen es. Wenn Sie 10 Studierende, Sie beginnen Ihre Schleife in der Erwartung zu gehen, durch die 10 Iterationen. Wenn Sie entfernen ein student, wie viele Iterationen machen das noch gehen müssen? Die Antwort offensichtlich hängt davon ab, wo Sie entfernt Ihre Schüler von der Liste und wo Sie derzeit in Ihrer iteation. Offensichtlich, java wissen es nicht.
Um dies zu umgehen, müssen Sie einen iterator. Sie können dies wie folgt:
Dürfen Sie nicht entfernen ein element aus
students
Sammlung während der Iteration durch.http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html
Versuchen
Wenn Sie innerhalb einer Schleife sollten Sie verwenden einen iterator und seine entfernen Methode
Sollten Sie nicht löschen von Objekten aus einer Sammlung während der Verwendung
eine for-each-Anweisung - bewirkt dies, dass Ausnahmen, wie Sie Ihre iterator-Gesichter einer geänderten Erhebung im Verlauf der Iterationen. (die for-Schleife)
verwenden Sie entweder eine reguläre for-Schleife (for int i = 0; i < 100; i++) usw...
oder halten die Objekte zu entfernen in eine Liste, und entfernen Sie Sie außerhalb der for-Schleife.
Auch, entfernen Sie das Objekt nach index index ist : 0 , 1 , 2
aber index sollte actaully, der index des Schüler.
Dürfen Sie nicht entfernen Sie ein element aus Ihrer Sammlung, während Sie Durchlaufen es. Der iterator erkennt eine strukturelle Veränderung, während seiner Verwendung, und wirft die Ausnahme. Viele Sammlungen sind so umgesetzt.
Verwenden Sie den iterator direkt statt:
können Sie vermeiden, concurrent modification error-kaufen, nur bricht die Schleife nach dem entfernen Sie das element oder, wenn die Methode über return Typ return-Wert nach dem entfernen Sie das element.