Java ConcurrentModificationException,但不从ArrayList中删除任何内容
因此,我正在制作一个游戏,每5秒必须产生一个敌人,知道当我运行我的应用程序时,它会抛出一个异常“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
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
。非常感谢您的回答!