2012-11-24 25 views
3

我一直在搜索相當多,似乎無法找到解決方案。我在這裏做錯了什麼?我的問題在標題中。這裏是例外,我得到:Java - 多次從ArrayList中刪除時出錯。 (IllegalStateException)

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(); 
} 
+2

你不覺得對谷歌,你應該只使用'iterator'遍歷列表,如果你想修改它? –

+1

@RohitJain yuo是對的,發佈它作爲一個答案與一些解釋有關它,我相信這將有助於至少OP和我 – Abubakkar

+0

@RohitJain但我**正在**修改它... – AppleDash

回答

12

你的迭代器無法正常初始化(next()不叫)。我建議寫這樣的代碼:

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

工作就像一個魅力,非常感謝! – AppleDash

+1

@bellum雖然你顯示的代碼有效,但你的答案是不正確的,因爲for循環中使用的隱藏迭代器和'if「塊中使用的迭代器之間沒有關係。 'remove'方法失敗,因爲在迭代器尚未啓動時調用它,正如@Evgeniy正確指出的那樣。調用'if'中的'configItems.remove(c)'可以獲得相同的結果。 – remigio

+0

@remigio你是對的。感謝名單。文本編輯。 – bellum

2

你可以叫Iterator.remove()只Iterator.next後()。試試這個:

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