下面是我的代码:
// 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;
}
}
}
}
错误java.util.ConcurrentModificationException
在标记行(Event e = it.next();
)处抛出。您是否在我的代码中看到了一个错误,使抛出异常的原因变得明显?
您正在修改eventList
,同时使用eventList.remove()
,同时迭代它。您不能这样做,否则Iterator
将无法使用。
把eventList.remove(e)
替换成it.remove()
就可以了。
此外,如果您的一个事件在第一次运行时没有准备好,您可能很容易陷入无休止的循环,因为it.hasNext()
一旦返回false
就永远不会返回true
,但size
也不会被修改。一种解决方案是将整个Iterator it = ...
行移动到第一个while
循环中。
我也会修改外部while
循环使用while (!e.isEmpty())
,而不是试图手动跟踪eventList
的大小。
应该通过迭代器删除该元素,否则迭代器会因为底层集合改变而重置。