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

时间:2015-07-12 18:18:54

标签: java loops iterator concurrentmodification

我正在尝试为closeScreen数组列表中的所有EntityPlayer对象调用playersUsing方法,但我一直遇到ConcurrentModificationException。 Iv'e尝试了我能想到的每一件事,当我使用迭代器时它甚至被抛出。我意识到这可能是一个重复但是我看了很多问题,到目前为止他们都没有帮助过我。我无法访问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;
}

2 个答案:

答案 0 :(得分:0)

  

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

所以可能的原因之一。

Route::get('/', function() {
    // Main 
});

Route::get('/path', function() {
    // .. 
});

Route::group(['domain' => 'subdomain.example.com'], function()
{
    Route::get('/', function() {
        // How to request this part?
    });

     Route::get('/test', function() {
        // Works
    });
}

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

答案 1 :(得分:0)

问题在于我已经使用closeScreen方法间接调用的预先存在的方法将用于从列表中移除玩家的代码放入。

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

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