并发修改异常迭代

时间:2018-07-30 01:05:38

标签: java exception error-handling

我对此进行了研究,并尝试通过更改集合和迭代器的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();

注意:尝试离开和离开只是检查条件的布尔函数,因此错误仅来自于我提供的此函数。

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

1 个答案:

答案 0 :(得分:0)

如何处理迭代器并不重要: 不管是在后台使用for循环,还是在使用过程中编辑基础数据结构时,您自己都会这样做。

解决此问题的方法是:

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

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

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

3)保留大量的编辑内容,并在最后进行编辑。