【发布时间】:2015-07-12 18:18:54
【问题描述】:
我正在尝试为 playersUsing 数组列表中的所有 EntityPlayer 对象调用 closeScreen 方法,但我一直遇到 ConcurrentModificationException。我已经尝试了我能想到的每一件事,甚至在我使用迭代器时都会抛出它。我意识到这可能是重复的,但我浏览了很多问题,但到目前为止没有一个对我有帮助。我无权访问EntityPlayer 类,因此我无法更改其中的任何代码。这是我目前正在使用的内容:
Iterator<EntityPlayer> iterator = playersUsing.iterator();
while (iterator.hasNext()) {
EntityPlayer player = iterator.next();
player.closeScreen();
System.out.println("CLOSED: " + player.username);
iterator.remove();
}
编辑:(这里是closeScreen 方法):
public void closeScreen()
{
this.openContainer = this.inventoryContainer;
}
【问题讨论】:
-
我意识到这并不能回答问题,但是为什么您需要在循环中将它们全部删除?您可以对每个元素执行
closeScreen(),然后在列表中调用clear()。 -
@Joffrey 没必要。到那时,我只是在尝试一些随机的东西,希望有些东西能奏效。
-
有什么办法可以做什么?如果您只需要在每个玩家上调用
closeScreen(),那么只需删除iterator.remove()。但无论如何,这不应该抛出ConcurrentModificationException。您是否有另一段代码同时运行并修改列表?异常到底是在哪里抛出的? -
@Joffrey 我不这么认为,但现在我真的在考虑它...... player.closeScreen() 可能会调用我用来删除玩家的相同方法从数组列表中。我现在要测试一下。
-
那时有例外是完全有道理的。您可能想重新考虑代码的组织。为什么玩家可以访问该列表?
标签: java loops iterator concurrentmodification