对 ArrayList 中的所有元素调用方法 Java

Invoking a Method on All Elements in an ArrayList Java

我试图为 playersUsing 数组列表中的所有 EntityPlayer 对象调用 closeScreen 方法,但我将 运行 保留在 ConcurrentModificationException 中。我已经尝试了所有我能想到的东西,甚至在我使用迭代器时都会抛出它。我意识到这可能是重复的,但我查看了大量问题,到目前为止,其中 none 个问题对我有所帮助。我无权访问 EntityPlayer class,因此我无法更改其中的任何代码。这是我目前正在处理的内容:

    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;
}

This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

所以可能的原因之一。

player.closeScreen();

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

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

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

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