【问题标题】:Invoking a Method on All Elements in an ArrayList Java对 ArrayList Java 中的所有元素调用方法
【发布时间】: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


【解决方案1】:

检测到并发的方法可能会抛出此异常 在不允许修改时修改对象。

所以可能的原因之一。

player.closeScreen();

正在尝试修改集合,而另一个 iterator.remove(); 正在对其进行迭代。

【讨论】:

  • 我以前认为这不是问题的原因是,正如我在问题中所说,我从未创建过 EntityPlayer 类,所以我看不到它如何修改我的列表。但后来我意识到 closeScreen 可能会以某种方式调用我用来从列表中删除玩家的方法。我正在测试,然后我会更新我的问题
【解决方案2】:

问题在于,我将用于从列表中删除玩家的代码放在了一个由 closeScreen 方法间接调用的预先存在的方法中。

我之所以间接说是因为closeScreen 方法所做的一切都是为了更新玩家当前的GUI“容器”。我没有意识到播放器是在单独的线程中更新的,一旦播放器更新,就会检测到 GUI 更改,它会为容器调用“GuiClose”方法。问题是,这恰好是我在玩家不再使用 GUI 时将代码从列表中删除的地方。我如何解决这个问题只是确保玩家实际上只是关闭了 GUI,而不是我的代码强制所有玩家存在。

真正让我感动的是 closeScreen 方法是完全模棱两可的,它似乎所做的只是改变玩家打开容器变量,所以我没有看到它怎么可能立即关闭玩家 GUI。也隐藏了这种多线程性质的行为是播放器在调用 closeScreen 后几乎立即更新,并且在我第一次迭代以在所有播放器上调用该方法之后,这种情况非常一致地发生。这使得它更难找到,因为您需要使用 GUI 的多个玩家,如果只有一个玩家,则只有一次迭代,代码似乎可以正常工作。如果我解释得不够清楚,请编辑或评论一些澄清建议。

【讨论】:

  • 按照你的解释行事..我猜 Ankur Anand 的回答很有帮助..那么
猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多