java - 在不删除任何内容的情况下获取并发修改异常

标签 java exception concurrency

我正在用 Java 编写简单的塔防游戏。这是找到从spawn(在构造函数中设置)到最近的base的路径的方法。

public int[] findPath(Field startField) {
    ArrayList<TestMonster> monsrs = new ArrayList<TestMonster>();
    TestMonster first = new TestMonster(startField.getCenter(), getStartingDirection(startField), new int[0]);
    monsters.add(first);
    while (true) {
        for (TestMonster monsr : monsrs) {
            monster.move();
            if (getFieldFromCenter(monsr.getPoint()).getState() == 101)
                return monsr.getPath();
            Field field = getFieldFromCenter(monsr.getPoint());
            if (field.isUp())
                monsters.add(new TestMonster(monsr.getPoint(), 0, monster.getPath()));
            if (field.isRight())
                monsters.add(new TestMonster(monsr.getPoint(), 90, monster.getPath()));
            if (field.isDown())
                monsters.add(new TestMonster(monsr.getPoint(), 180, monster.getPath()));
            if (field.isLeft())
                monsters.add(new TestMonster(monsr.getPoint(), 270, monster.getPath()));
            if (monsrs.isEmpty())
                return null;
        }
    }
}

它可能会返回怪物移动到基地的下一个方向的数组,如果没有路径,则返回 null。它遍历 Field 类对象的字段。在每个 field 上,怪物都会搜索可能的 Action ,并为每个 field 创建具有设定方向的新怪物。新的怪物继承也会移动阵列添加自己的方向,然后将其传递给新的怪物等等。我的问题是我的代码中哪里可以并发 mod ex?我该如何预防呢?

堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at towerdefence.MainPanel.findPath(MainPanel.java:160)
at towerdefence.MainPanel$1.actionPerformed(MainPanel.java:62)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1664)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:306)
at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:250)
at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2971)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2963)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
at java.awt.Component.processEvent(Component.java:6282)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)

最佳答案

迭代器失败速度很快,因此如果您使用迭代器来迭代集合,则无法同时修改集合。意味着使用迭代器,不能同时迭代和修改集合。例如向您正在迭代的集合中添加或删除某些内容。

What is a fail fast iterator

另请参阅此问题 fail-fast iterator

关于java - 在不删除任何内容的情况下获取并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14579911/

相关文章:

Java Jsyn设置过滤器的输入、处理和获取输出

c++ - Visual C++ 非托管代码 : Use/EHa or/EHsc for C++ exceptions?

xamarin - 如何解决 Xamarin.Forms.Platform.Android.ListViewAdapter.IsEnabled 异常?

java - ReentrantLock 同步getters和setters

performance - STM 性能不佳/锁定

java - 两个 double 组相等

java - 对 EJB (2.1) 的所有调用进行通用日志记录?

java - 捕获多个异常 - 在捕获到异常时调用异常中不存在的方法

php - Doctrine 实体管理器和多线程更新数据库

java - java中BlockingQueue/ArrayBlockingQueue的序列化