【问题标题】:Java - Error when removing from an ArrayList more than once. (IllegalStateException)Java - 多次从 ArrayList 中删除时出错。 (非法状态异常)
【发布时间】:2012-11-24 08:50:25
【问题描述】:

我已经在谷歌上搜索了很长时间,但似乎找不到解决方案。我在这里做错了什么?我的问题在标题中。这是我得到的例外:

java.lang.IllegalStateException
at java.util.ArrayList$Itr.remove(Unknown Source)
at me.herp.derp.client.Config.updateItem(Config.java:24)
at me.herp.derp.client.Commands.parseCommand(Commands.java:23)
at me.herp.derp.client.ChatCommands.handleChatcommand(ChatCommands.java:29)
at net.minecraft.src.EntityClientPlayerMP.sendChatMessage(EntityClientPlayerMP.java:171)
at net.minecraft.src.GuiChat.keyTyped(GuiChat.java:104)
at net.minecraft.src.GuiScreen.handleKeyboardInput(GuiScreen.java:227)
at net.minecraft.src.GuiScreen.handleInput(GuiScreen.java:176)
at net.minecraft.client.Minecraft.runTick(Minecraft.java:1494)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:843)
at net.minecraft.client.Minecraft.run(Minecraft.java:768)
at java.lang.Thread.run(Unknown Source)

这是我的代码:

public static void updateItem(String item, String value)
{
    if (!hasValue(item))
    {
        addItem(item, value);
        return;
    }
    for (ConfigItem c : configItems)
    {
        if (c.ITEM.equals(item))
        {
            configItems.iterator().remove();
            break;
        }
    }
    ConfigFile.saveConfig();
}

【问题讨论】:

  • 你没有在谷歌上找到,如果你想修改它,你应该只使用iterator 来迭代你的列表吗?
  • @RohitJain yuo 是对的,将其作为答案发布并对此进行一些解释,我相信它至少会对 OP 和我有所帮助
  • @RohitJain 但我正在修改它...
  • @Abu.. 和 OP。请参阅这篇文章 - stackoverflow.com/questions/223918/…。它最好地解释它。
  • @RohitJain 谢谢,但链接不正确,请编辑它。

标签: java exception arraylist minecraft


【解决方案1】:

您的迭代器未正确初始化(未调用next())。我建议这样写代码:

Iterator<ConfigItem> it = configItems.iterator();
while(it.hasNext()){
    ConfigItem c = it.next();
    if (c.ITEM.equals(item))
    {
        it.remove();
        break;
    }
}

【讨论】:

  • @bellum 尽管您显示的代码有效,但您的答案并不正确,因为 for 循环中使用的隐藏迭代器与 if 块中使用的迭代器之间没有关系。 @Evgeniy 正确指出,remove 方法失败,因为它是在尚未启动的迭代器上调用的。在if 中调用configItems.remove(c) 可以获得相同的结果。
  • 我有复杂的需求。有嵌套的迭代器。在内部迭代器的条件下,必须从外部迭代器中删除对象。您回答中的break 声明帮助了我。感谢分享
【解决方案2】:

您只能在 Iterator.next() 之后调用 Iterator.remove()。试试这个:

Iterator<ConfigItem> i = configItems.iterator();
while(i.hasNext()) {
    ConfigItem next = i.next();
    if (next.equals(item))
    {
        i.remove();
        break;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多