【问题标题】:concurrent modification exception iterations并发修改异常迭代
【发布时间】:2018-07-30 01:05:37
【问题描述】:

我对此进行了研究,并尝试通过将我的集合和 for 循环更改为迭代器来修复此异常,但这似乎并没有解决它。我仍然遇到同样的错误。

他是来自eclipse的错误日志:https://imgur.com/a/uqULZsw

这是我在 BountyHunterController 文件中的 removeTarget 函数

public void removeTarget(Player player) {

    player.getTemporaryAttributtes().remove(TARGET_IDENTIFIER);
    player.getPackets().sendIComponentText(1296, 25, "None");

    Iterator<Player> iterator = getPlayers().iterator();
    while (iterator.hasNext()) {
        Player p = iterator.next();
        Optional<Player> targ = minigame.getTarget(p);
        if (targ.isPresent()) {
            if (targ.get().getUsername().equalsIgnoreCase(player.getUsername())) {
                p.getTemporaryAttributtes().remove(TARGET_IDENTIFIER);
                p.getPackets().sendIComponentText(1296, 25, "None");
                p.sendMessage("<col=FE1212>Your target has left, and you will be assigned another one.");
                Controler con = p.getControlerManager().getControler();
                if (con != null) {
                    if (con instanceof BountyHunterController) {
                        BountyHunterController bh = (BountyHunterController) con;
                        minigame.map.remove(type, player);
                        bh.assignTarget();
                    }
                }
            }
        }
    }
    minigame.map.remove(type, player);
    return;
}

这是第 495 行的错误

玩家 p = iterator.next();

注意:尝试离开,离开只是布尔函数检查条件,所以错误只是我提供的这个函数。

我做错了什么,我该如何解决这个问题?

【问题讨论】:

标签: java exception error-handling


【解决方案1】:

如何处理迭代器并不重要: 无论是在后台使用 for 循环,还是您自己在使用时编辑底层数据结构,都会发生这种情况。

解决此问题的方法是:

1) 如果可以,不要使用迭代器,使用计数器访问元素。

例如:对于列表迭代器,请使用: for(int i=0; i&lt;player_list.size(); i++) {... 和循环内:player = player_list.get(i)

2) 遍历数据结构的副本,但这当然意味着复制。

3) 保留您的编辑并在最后进行。

【讨论】:

  • 但这真的能解决我的错误吗?你推荐哪一个,你能告诉我如何正确地做到这一点,因为我尝试了很多都没有结果。谢谢!
  • 我希望您的迭代器实际上是一个 ListIterator,因此您可以使用基本的 for 循环
  • 我有一个for循环,当它不起作用时,我将其更改为这个,它仍然不起作用。
  • 我假设 getPlayers 后面的列表在某处进行了编辑(我认为这很可能),但如果这不是真的,这将无济于事。一种检查方法是使用调试器并在 player_list 的编辑函数上放置断点
猜你喜欢
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2014-10-08
  • 2015-09-03
  • 2018-10-21
  • 2016-11-19
相关资源
最近更新 更多