Thread" AWT-EventQueue-0"中的ConcurrentModificationException?

时间:2014-09-14 01:42:56

标签: java

我正在尝试用java gui进行文本冒险。我刚刚开始这个项目,我正试图让游戏意识到当玩家输入"得到" +项目。我想让它从当前的ArrayList中取出该项目并将其添加到我所做的库存屏幕中。目前一切正常,除了我键入一个不同的命令,如" look"。它应该显示的只是房间描述,但是它描述并拿起物品并将其放入库存屏幕。然后我收到了这个错误。

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Gamegui.processCommands(Gamegui.java:327)
at Gamegui.playerInputKeyPressed(Gamegui.java:359)
at Gamegui.access$200(Gamegui.java:14)
at Gamegui$3.keyPressed(Gamegui.java:171)
at java.awt.Component.processKeyEvent(Component.java:6483)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2829)
at java.awt.Component.processEvent(Component.java:6302)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
at java.awt.Component.dispatchEventImpl(Component.java:4752)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
BUILD SUCCESSFUL (total time: 10 seconds)

这是我的相关代码。

processCommands

public void processCommands(String input)
{
    ArrayList<String> items = currentRoom.getItems();

    if(input.equals("look"))
    {
        gameScreen.append("\n" + currentRoom.getDescription());
    }
    for(String item : items)
    {
        if(input.equals("get " + item));
        {
            items.remove(item);
            gameScreen.append("\nYou pick up the " + item);
            invScreen.append("\n" + item);
            playerInput.setText("");
        }
    }
}

playerInputKeyPressed

private void playerInputKeyPressed(java.awt.event.KeyEvent evt) {                                       
    if(evt.getKeyCode() == evt.VK_ENTER)
    {
        getInput();
        if(validCommands(inputText)) 
        {
            processCommands(inputText);
        }
        else
        {
            gameScreen.append("\nI don't Understand");
        }

        playerInput.setText("");

        try
        {
            JScrollBar sb = gameScreenPlace.getVerticalScrollBar();
            sb.setValue(sb.getMaximum());
        }
        catch(java.lang.NullPointerException err)
        {

        }
    }
}                   

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您在迭代时删除项目。

   for(String item : items)
    {
        if(input.equals("get " + item));
        {
            items.remove(item);
            gameScreen.append("\nYou pick up the " + item);
            invScreen.append("\n" + item);
            playerInput.setText("");
        }
    }

使用Iterator并以这种方式调用remove。

Iterator<String> iter = items.iterator();

while (iter.hasNext()) {
    String str = iter.next();

   if(input.equals("get " + str))
        {
        iter.remove();
        gameScreen.append("\nYou pick up the " + str);
        invScreen.append("\n" + str);
        playerInput.setText("");
        }

}

reference

同时删除分号到此行。

`if(input.equals("get " + str))`