我正在尝试用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)
{
}
}
}
有人可以帮我解决这个问题吗?
答案 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("");
}
}
同时删除分号到此行。
`if(input.equals("get " + str))`