Atascado con "java.util.ConcurrentModificationException"
linked-list (2)
Aquí está mi código:
// eventList is a LinkedList
public void run() {
Iterator<Event> it = eventList.iterator();
int size = eventList.size();
while(size > 0) {
while(it.hasNext()) {
Event e = it.next(); //flaged line
if(e.ready()) {
System.out.println(e);
e.action();
eventList.remove(e);
--size;
}
}
}
}
El error java.util.ConcurrentModificationException
se arroja a la bandera alineada ( Event e = it.next();
). ¿Ve un error en mi código que hace obvio el motivo de esa excepción?
Debe eliminar el elemento a través del iterador, de lo contrario, el iterador se restablece porque la colección subyacente cambió.
Está modificando eventList
mientras usa eventList.remove()
mientras itera sobre él. No debe hacer esto, o el Iterator
queda inutilizable.
Simplemente reemplace eventList.remove(e)
con it.remove()
y debería estar bien.
Además, puede ejecutar fácilmente un bucle sin fin si uno de sus eventos no está listo en la primera ejecución porque it.hasNext()
nunca volverá a ser true
una vez que haya resultado false
, pero el size
tampoco se modificará. Una solución sería mover todo el Iterator it = ...
línea dentro del primer ciclo while.
También modificaría el bucle while
externo para usar while (!e.isEmpty())
lugar de intentar seguir el tamaño de eventList
manualmente.