Java ConcurrentModificationException,但不从ArrayList中删除任何内容

Java ConcurrentModificationException,但不从ArrayList中删除任何内容,java,arrays,arraylist,exception-handling,Java,Arrays,Arraylist,Exception Handling,因此,我正在制作一个游戏,每5秒必须产生一个敌人,知道当我运行我的应用程序时,它会抛出一个异常“ConcurrentModificationException”。 这是我代码的一部分: private void tick() { exec.scheduleAtFixedRate(new Runnable() { @Override public void run() { enemyY = enemyYRand.next

因此,我正在制作一个游戏,每5秒必须产生一个敌人,知道当我运行我的应用程序时,它会抛出一个异常“
ConcurrentModificationException
”。 这是我代码的一部分:

private void tick() {

    exec.scheduleAtFixedRate(new Runnable() {
          @Override
          public void run() {
              enemyY = enemyYRand.nextInt(6);
              enemy.add(new Enemy(enemyY, 10, enemyImg));
          }
    }, 0, 5, TimeUnit.SECONDS);

    if (player.y > getHeight() - playerImg.getHeight(null)) {
        player.setY(-10);
    }
    if (player.y < 0) {
        player.setY(+10);
    }
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    for(Enemy enemys : enemy) {
        enemys.render(g);
    }
    player.render(g);
}

似乎有两个线程同时在
ArrayList
上运行

synchronized (enemy) {
    enemy.add(new Enemy(enemyY, 10, enemyImg));
}

其中一个是在事件分派线程中,其中调用了
paintComponent
。您正在使用增强的for循环,该循环在内部使用
迭代器。这个迭代器抛出的是
ConcurrentModificationException

调用
敌方添加(新敌方(enemyY,10,enemyImg))时,您正在另一个线程中修改
tick
方法中的
ArrayList

Iterator
注意到
ArrayList
被修改并抛出异常。当您显示敌人时,有必要对您的
ArrayList
有一个一致的视图

通过将此
ArrayList
上的读写操作包含在
synchronized
块中,同步对某个对象(甚至可能是
敌方
本身)上的
ArrayList
的访问。这意味着这些块中只有一个可以同时执行

synchronized (enemy) {
    enemy.add(new Enemy(enemyY, 10, enemyImg));
}


似乎有两个线程同时在
ArrayList
上运行

synchronized (enemy) {
    enemy.add(new Enemy(enemyY, 10, enemyImg));
}

其中一个是在事件分派线程中,其中调用了
paintComponent
。您正在使用增强的for循环,该循环在内部使用
迭代器。这个迭代器抛出的是
ConcurrentModificationException

调用
敌方添加(新敌方(enemyY,10,enemyImg))时,您正在另一个线程中修改
tick
方法中的
ArrayList

Iterator
注意到
ArrayList
被修改并抛出异常。当您显示敌人时,有必要对您的
ArrayList
有一个一致的视图

通过将此
ArrayList
上的读写操作包含在
synchronized
块中,同步对某个对象(甚至可能是
敌方
本身)上的
ArrayList
的访问。这意味着这些块中只有一个可以同时执行

synchronized (enemy) {
    enemy.add(new Enemy(enemyY, 10, enemyImg));
}


你能把stacktrace贴出来吗?顺便说一句,我建议你读一下:@Pshemo谢谢,你能告诉我们你打电话到哪里吗?这是您自己的方法吗?
ConcurrentModificationException
s可以与对集合的任何修改、添加和删除相关联。@svasa paintComponent是您在AWT/Swing中重写的方法,用于绘制您自己的组件。您可以发布stacktrace吗?顺便说一句,我建议你读一下:@Pshemo谢谢,你能告诉我们你打电话到哪里吗?这是您自己的方法吗?
ConcurrentModificationException
s可以与对集合的任何修改、添加和删除相关联。@svasa paintComponent是您在AWT/Swing中重写的方法,用于绘制您自己的组件。完整性的其他选项:使用固有线程安全的数据结构,例如
CopyOnWriteArrayList
ConcurrentSkipListSet
。或者使用
集合包装您的列表。synchronizedList
。非常感谢您的回答!其他完整性选项:使用本质上是线程安全的数据结构,例如
CopyOnWriteArrayList
ConcurrentSkipListSet
。或者使用
集合包装您的列表。synchronizedList
。非常感谢您的回答!