这是我的代码:
// 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();
)时抛出。你是否在我的代码中看到一个错误,这个错误明显是抛出异常的原因?
答案 0 :(得分:17)
您在使用eventList
进行迭代时正在修改eventList.remove()
。您不能这样做,或Iterator
变得无法使用。
只需将eventList.remove(e)
替换为it.remove()
,就可以了。
此外,如果您的某个事件在第一次运行中没有准备就绪,您可以很容易地遇到无限循环,因为it.hasNext()
一旦返回true
将永远不会返回false
,但是size
也不会被修改。一种解决方案是将整个Iterator it = ...
行移到第一个while
循环中。
我还要修改外部while
循环以使用while (!e.isEmpty())
,而不是尝试手动跟踪eventList
的大小。
答案 1 :(得分:1)
您应该通过迭代器删除元素,否则迭代器会被重置,因为底层集合已更改。