Here is my code:
// 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;
}
}
}
}
The error java.util.ConcurrentModificationException
is thrown at the flag lined (Event e = it.next();
). Do you see a mistake in my code that makes obvious the reason of that exception to be thrown?
Your are modifying eventList
while using eventList.remove()
while iterating over it. You must not do this, or the Iterator
becomes unusable.
Simply replace eventList.remove(e)
with it.remove()
and it should be fine.
Also, you can easily run into an endless loop if one of your events isn't ready in the first run because it.hasNext()
will never return true
once it returned false
, but size
won't be modified either. One solution would be to move the whole Iterator it = ...
line inside the first while
loop.
I'd also modify the outer while
loop to use while (!e.isEmpty())
instead of trying to track the size of eventList
manually.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With