【问题标题】:ConcurrentModificationException in thread "AWT-EventQueue-0"? [duplicate]线程“AWT-EventQueue-0”中的 ConcurrentModificationException? [复制]
【发布时间】:2014-11-07 21:00:47
【问题描述】:

我正在尝试在 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)

这是我的相关代码。

进程命令

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)
        {

        }
    }
}                   

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

【问题讨论】:

  • 好的,很明显的问题 - 哪一行是 Gamegui.java:327,异常消息告诉您的那一行是导致您的问题的原因?
  • 你删除迭代元素内的项目;
  • 是的,使用 Iterator 来执行此操作。

标签: java


【解决方案1】:

您在迭代时删除项目。

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

使用迭代器并以这种方式调用 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))`

【讨论】:

  • 好吧,我这样做不会出错,但是如果我键入“get”而不输入项目,它会进入我的 inv 屏幕。如果我输入look,它会显示房间描述,并将项目放在inv 屏幕中。我不知道为什么
  • 没问题。您可以通过单击我的答案中的检查来解决此问题来接受此答案。此外,无论您喜欢与否,您都可以对答案投赞成票或反对票。
  • 也感谢您的建议。我对此很陌生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2015-11-25
  • 2013-04-28
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多