Heim >Java >javaLernprogramm >Warum verursacht das Ändern einer ArrayList während einer For-Each-Schleife eine ConcurrentModificationException?
ConcurrentModificationException für ArrayList
Betrachten Sie den folgenden Code:
private String toString(List<DrugStrength> aDrugStrengthList) { StringBuilder str = new StringBuilder(); for (DrugStrength aDrugStrength : aDrugStrengthList) { if (!aDrugStrength.isValidDrugDescription()) { aDrugStrengthList.remove(aDrugStrength); } } str.append(aDrugStrengthList); if (str.indexOf("]") != -1) { str.insert(str.lastIndexOf("]"), "\n " ); } return str.toString(); }
Bei Ausführung löst dieser Code eine ConcurrentModificationException aus. Diese Ausnahme tritt auf, weil das Ändern der ArrayList während der Iteration mit einer for-each-Schleife unsicher ist.
Um dieses Problem zu beheben, ersetzen Sie die for-each-Schleife durch eine Iteratorschleife:
for (Iterator<DrugStrength> it = aDrugStrengthList.iterator(); it.hasNext(); ) { DrugStrength aDrugStrength = it.next(); if (!aDrugStrength.isValidDrugDescription()) { it.remove(); } }
An iterator bietet eine sichere Möglichkeit, Elemente aus einer ArrayList zu entfernen, während darüber iteriert wird. Es verwaltet einen Cursor, der die aktuelle Position in der Liste verfolgt und sicherstellt, dass das Entfernen eines Elements keine Auswirkungen auf den Iterationsprozess hat.
Das obige ist der detaillierte Inhalt vonWarum verursacht das Ändern einer ArrayList während einer For-Each-Schleife eine ConcurrentModificationException?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!