3

I've been googling around for quite a bit, and can't seem to find a solution. What have I done wrong here? My problem is in the title. Here is the exception I get:

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)

And here is my code:

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();
}
AppleDash
  • 1,544
  • 2
  • 13
  • 27

2 Answers2

14

Your iterator wasn't initialized properly (next() was not called). I suggest to write this code like this:

Iterator<ConfigItem> it = configItems.iterator();
while(it.hasNext()){
    ConfigItem c = it.next();
    if (c.ITEM.equals(item))
    {
        it.remove();
        break;
    }
}
bellum
  • 3,642
  • 1
  • 17
  • 22
  • 1
    @bellum Although the code you show works, your answer isn't correct, because there is no relation between the hidden iterator used in the for loop and the iterator used in the `if` block. The `remove` method fails because it's called on an iterator not yet started, as @Evgeniy correctly points out. The same result could be obtained calling `configItems.remove(c)` inside the `if`. – remigio Nov 24 '12 at 09:52
  • I had complex requirement. There were nested iterator. On a condition of inner iterator have to remove object from outer iterator. the `break` statement from your answer helped me out. Thanks for sharing – Swapnil Sawant Dec 22 '15 at 13:18
2

You can call Iterator.remove() only after Iterator.next(). Try this:

Iterator<ConfigItem> i = configItems.iterator();
while(i.hasNext()) {
    ConfigItem next = i.next();
    if (next.equals(item))
    {
        i.remove();
        break;
    }
Evgeniy Dorofeev
  • 133,369
  • 30
  • 199
  • 275