【发布时间】:2015-01-18 11:56:24
【问题描述】:
我正在使用迭代器来循环一个集合,如下所示:
Iterator<Entity> entityItr = entityList.iterator();
while (entityItr.hasNext())
{
Entity curr = entityItr.next();
for (Component c : curr.getComponents())
{
if (c instanceof PlayerControlled)
{
((PlayerControlled) c).pollKeyboard();
}
}
}
但是在下面一行我得到一个 ConcurrentModificationException
Entity curr = entityItr.next();
为什么在我没有改变任何东西时会发生这种情况?
非常感谢
编辑 - 堆栈跟踪:
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at cw.systems.Input.checkInputs(Input.java:31)
at cw.systems.Input.begin(Input.java:21)
at cw.misc.Game.render(Game.java:73)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:207)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
【问题讨论】:
-
堆栈跟踪应该解释它。阅读它,然后发布它。异常名称和 javadoc 也说明了这一点:您正在修改集合,同时对其进行迭代。
-
你确定
pollKeyboard不能修改entityList吗? -
@SebastianRedl 我认为如果
pollKeyboard正在修改entityList会以某种方式从((PlayerControlled) c).pollKeyboard();而不是Entity curr = entityItr.next();抛出异常。对吗? -
@EpicPandaForce 抛出此错误是为了防止更严重的并发问题,这些问题可能更难找到。如果您进入循环,但在您访问元素
i之前的某个元素之前,i被移除并转移其他元素怎么办?你最终会跳过一个元素。 -
使用迭代器可以在对集合进行迭代的同时对其进行修改,只要您使用迭代器的方法对其进行修改即可。不,迭代器不会再次重建。在每次迭代中,相同的迭代器对象用于获取下一个元素。