不确定为什么会出现并发修改异常
Not sure why there is concurrent modification exception
我正在遍历两个 Orb 对象列表
目前,当我浏览这两个列表时,我会在遍历它们时添加和删除 Orb 对象。
//first I iterate through the "friendly" orb list.
for(orbIterator = friendlyOrbs.listIterator(); orbIterator.hasNext();) {
//I have only included what I (think) is the relevant code.
Orb tempOrb = orbIterator.next(); //Set a reference to the current orb object so I can update it and use its properties.
//Some drawing stuff I don't include.
//The orb is not dead
int orbResult = tempOrb.Update(); //Updates the orb object and returns its current state.
if(orbResult == 0) {
} else if(orbResult == 2) {
//Died a natural death
//Stuff to do when the orb dies naturally.
orbIterator.remove();
} else if(orbResult == 3) {
//Killed by player.
//stuff to do when player kills orb.
orbIterator.remove();
orbIterator.add(new Orb(...));
}
}
现在这就是我遍历 "enemy" orb 列表的方式:
for(orbIterator = enemyOrbs.listIterator(); orbIterator.hasNext();) {
Orb tempOrb = orbIterator.next();
int orbResult = tempOrb.Update();
if(orbResult == 0) {
} else if (orbResult == 2) {
//Enemy orb died a natural death.
orbIterator.remove();
enemyOrbs.add(...);
} else if(orbResult == 3) {
//Enemy orb killed by player.
orbIterator.remove();
} else {
//Draw the orb.
}
}
我还有两个计时器任务(一个用于生成友好的球体,一个用于生成敌人的球体),它们设置了一个布尔标志,告诉 onDraw 方法是否应该向屏幕添加一个新的球体。
//the friendly orb timertask
public static class FriendlyOrbTimerTask extends TimerTask implements Cloneable {
@Override
public void run() {
if(SystemClock.uptimeMillis() - drawCallTime < 100) {
Log.i("ADDING NEW ORB", "ADDING NEW ORB");
friendlyOrbToBeAdded = true;
friendlyOrbSpawnInterval += 250;
TIMER.schedule(this.clone(), friendlyOrbSpawnInterval);
} else {
pauseStartTime = SystemClock.uptimeMillis();
}
}
@Override
public FriendlyOrbTimerTask clone(){
return new FriendlyOrbTimerTask(); //add parameters from the current contextif needed.
}
}
这是 enemyOrb 计时器任务:
public static class EnemyOrbTimerTask extends TimerTask implements Cloneable {
@Override
public void run() {
if(SystemClock.uptimeMillis() - drawCallTime < 50) {
enemyOrbToBeAdded = true;
enemyOrbSpawnInterval+= 250;
TIMER.schedule(this.clone(), enemyOrbSpawnInterval);
}
}
@Override
public EnemyOrbTimerTask clone(){
return new EnemyOrbTimerTask(); //add parameters from the current contextif needed.
}
}
以下是 if 语句,告诉我是否应该向屏幕添加一个新球体(位于 onDraw 中)
//These are located right before I iterate through the lists.
if(friendlyOrbToBeAdded) {
friendlyOrbs.add(...);
friendlyOrbToBeAdded = false;
}
if(enemyOrbToBeAdded) {
enemyOrbs.add(...);
enemyOrbToBeAdded = false;
}
问题是有时我的应用程序会在以下行随机崩溃:
Orb tempOrb = orbIterator.next(); //This is in the enemyOrb iterator loop.
它给出了例外:java.util.ConcurrentModificationException
我不知道为什么会这样,因为我正在使用 listIterator.add()
和 listIterator.remove()
,这应该可以让我避免这些异常。
如果你的复制粘贴是准确的,那么我认为是这个问题:
for(orbIterator = enemyOrbs.listIterator(); orbIterator.hasNext();) {
...
enemyOrbs.add(...);
...
}
您在迭代集合时调用了集合 add
。
我正在遍历两个 Orb 对象列表
目前,当我浏览这两个列表时,我会在遍历它们时添加和删除 Orb 对象。
//first I iterate through the "friendly" orb list.
for(orbIterator = friendlyOrbs.listIterator(); orbIterator.hasNext();) {
//I have only included what I (think) is the relevant code.
Orb tempOrb = orbIterator.next(); //Set a reference to the current orb object so I can update it and use its properties.
//Some drawing stuff I don't include.
//The orb is not dead
int orbResult = tempOrb.Update(); //Updates the orb object and returns its current state.
if(orbResult == 0) {
} else if(orbResult == 2) {
//Died a natural death
//Stuff to do when the orb dies naturally.
orbIterator.remove();
} else if(orbResult == 3) {
//Killed by player.
//stuff to do when player kills orb.
orbIterator.remove();
orbIterator.add(new Orb(...));
}
}
现在这就是我遍历 "enemy" orb 列表的方式:
for(orbIterator = enemyOrbs.listIterator(); orbIterator.hasNext();) {
Orb tempOrb = orbIterator.next();
int orbResult = tempOrb.Update();
if(orbResult == 0) {
} else if (orbResult == 2) {
//Enemy orb died a natural death.
orbIterator.remove();
enemyOrbs.add(...);
} else if(orbResult == 3) {
//Enemy orb killed by player.
orbIterator.remove();
} else {
//Draw the orb.
}
}
我还有两个计时器任务(一个用于生成友好的球体,一个用于生成敌人的球体),它们设置了一个布尔标志,告诉 onDraw 方法是否应该向屏幕添加一个新的球体。
//the friendly orb timertask
public static class FriendlyOrbTimerTask extends TimerTask implements Cloneable {
@Override
public void run() {
if(SystemClock.uptimeMillis() - drawCallTime < 100) {
Log.i("ADDING NEW ORB", "ADDING NEW ORB");
friendlyOrbToBeAdded = true;
friendlyOrbSpawnInterval += 250;
TIMER.schedule(this.clone(), friendlyOrbSpawnInterval);
} else {
pauseStartTime = SystemClock.uptimeMillis();
}
}
@Override
public FriendlyOrbTimerTask clone(){
return new FriendlyOrbTimerTask(); //add parameters from the current contextif needed.
}
}
这是 enemyOrb 计时器任务:
public static class EnemyOrbTimerTask extends TimerTask implements Cloneable {
@Override
public void run() {
if(SystemClock.uptimeMillis() - drawCallTime < 50) {
enemyOrbToBeAdded = true;
enemyOrbSpawnInterval+= 250;
TIMER.schedule(this.clone(), enemyOrbSpawnInterval);
}
}
@Override
public EnemyOrbTimerTask clone(){
return new EnemyOrbTimerTask(); //add parameters from the current contextif needed.
}
}
以下是 if 语句,告诉我是否应该向屏幕添加一个新球体(位于 onDraw 中)
//These are located right before I iterate through the lists.
if(friendlyOrbToBeAdded) {
friendlyOrbs.add(...);
friendlyOrbToBeAdded = false;
}
if(enemyOrbToBeAdded) {
enemyOrbs.add(...);
enemyOrbToBeAdded = false;
}
问题是有时我的应用程序会在以下行随机崩溃:
Orb tempOrb = orbIterator.next(); //This is in the enemyOrb iterator loop.
它给出了例外:java.util.ConcurrentModificationException
我不知道为什么会这样,因为我正在使用 listIterator.add()
和 listIterator.remove()
,这应该可以让我避免这些异常。
如果你的复制粘贴是准确的,那么我认为是这个问题:
for(orbIterator = enemyOrbs.listIterator(); orbIterator.hasNext();) {
...
enemyOrbs.add(...);
...
}
您在迭代集合时调用了集合 add
。