Java 游戏在重新启动时有时会崩溃
大家好,我的社区, 我需要一些帮助。这个ConcurrentModificationException错误让我抓狂!我最近刚刚开始android游戏开发和编程 当我玩我的游戏时,它是完美的,但有时如果我试图开始一个新游戏,它会崩溃。Logcat在我的代码中显示了这两行,但我不知道如何修复它,因为它们在我看来是正确的:/Java 游戏在重新启动时有时会崩溃,java,android,arraylist,crash,draw,Java,Android,Arraylist,Crash,Draw,大家好,我的社区, 我需要一些帮助。这个ConcurrentModificationException错误让我抓狂!我最近刚刚开始android游戏开发和编程 当我玩我的游戏时,它是完美的,但有时如果我试图开始一个新游戏,它会崩溃。Logcat在我的代码中显示了这两行,但我不知道如何修复它,因为它们在我看来是正确的:/ public void run() { while (playing) { update(); draw(); //the draw-me
public void run() {
while (playing) {
update();
draw(); //the draw-method is marked
control(); } }
在我的画法中:
// I draw the SpaceDust from an ArrayList
paint.setColor(Color.argb(255, 255, 255, 255));
for (SpaceDust sd : dustList) {
canvas.drawPoint(sd.getX(), sd.getY(), paint); }
有什么想法吗?
谢谢Niclas
编辑:LogCat输出
FATAL EXCEPTION: Thread-146798
Process: niclas.spacegame, PID: 7983
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at niclas.spacegame.GameActivity$TDView.update(GameActivity.java:285)
at niclas.spacegame.GameActivity$TDView.run(GameActivity.java:206)
at java.lang.Thread.run(Thread.java:818)
编辑:更新方法
私有void更新(){
布尔值=假;
if(矩形相交(player.getHitbox(),enemy1.getHitbox()){
hit=true;
enemy1.setX(-100);
}
if(矩形相交(player.getHitbox(),enemy2.getHitbox()){
hit=true;
enemy2.setX(-100);
}
if(矩形相交(player.getHitbox(),enemy3.getHitbox()){
hit=true;
enemy3.setX(-100);
}
如果(屏幕X>1000){
if(矩形相交(player.getHitbox(),enemy4.getHitbox()){
hit=true;
enemy4.setX(-100);
}
}
如果(屏幕X>1200){
if(矩形相交(player.getHitbox(),enemy3.getHitbox()){
hit=true;
灌肠5.setX(-100);
}
}
如果(检测到HIT){
声音池。播放(凹凸,1,1,0,0,1);
player.reduceShieldStrength();
if(player.getShieldStrength()<0){
声音池。播放(被破坏,1,1,0,0,1);
gameend=true;
}
}
player.update();
enemy1.update(player.getSpeed());
enemy2.update(player.getSpeed());
enemy3.update(player.getSpeed());
if(screenX > 1000) {
enemy4.update(player.getSpeed());
}
if(screenX > 1200) {
enemy5.update(player.getSpeed());
}
for (SpaceDust sd : dustList) {
sd.update(player.getSpeed());
}
if(!gameEnded) {
distanceRemaining -= player.getSpeed();
timeTaken = System.currentTimeMillis() - timeStarted;
}
if(distanceRemaining < 0){
soundPool.play(win, 1, 1, 0, 0, 1);
if(timeTaken < fastestTime) {
editor.putLong("fastestTime", timeTaken);
editor.commit();
fastestTime = timeTaken;
}
distanceRemaining = 0;
gameEnded = true;
}
}
player.update();
enemy1.update(player.getSpeed());
enemy2.update(player.getSpeed());
enemy3.update(player.getSpeed());
如果(屏幕X>1000){
enemy4.update(player.getSpeed());
}
如果(屏幕X>1200){
enemy5.update(player.getSpeed());
}
用于(SpaceDust sd:dustList){
sd.update(player.getSpeed());
}
如果(!gameEnded){
距离剩余-=player.getSpeed();
timetake=System.currentTimeMillis()-timeStarted;
}
如果(剩余距离<0){
声音池。播放(赢,1,1,0,0,1);
if(所用时间<最快时间){
编辑:putLong(“最快的时间”,耗时);
commit();
最快时间=所用时间;
}
剩余距离=0;
gameend=true;
}
}
您可能正在从列表中删除一个元素,同时在其他地方使用“for each”循环访问该元素
首先,使用迭代器,但也将对数组列表的访问包装在一个同步块中:
synchronized(dustList){
int numSpecs = 400;
for (int i = 0; i < numSpecs; i++) {
SpaceDust spec = new SpaceDust(screenX, screenY);
dustList.add(spec);
}
}
替换:
for (SpaceDust sd : dustList) {
sd.update(player.getSpeed());
}
与:
已同步(灰尘列表){
Iterator it=dustList.Iterator();
while(it.hasNext(){
SpaceDust sd=it.next();
sd.update(player.getSpeed());
}
}
并将列表修改器包装在同步块中:
synchronized(dustList){
int numSpecs = 400;
for (int i = 0; i < numSpecs; i++) {
SpaceDust spec = new SpaceDust(screenX, screenY);
dustList.add(spec);
}
}
已同步(灰尘列表){
int numSpecs=400;
对于(inti=0;i
这种方法效率很低,但应该可以解决您的问题。这是锁定数组列表,以便在读取或写入数组列表时无法对其进行修改。是否
drawPoint
或它调用的任何东西试图修改dustList
?您忘记了从update方法添加logcat.post代码。异常源自update me方法。有时它会连续运行10个名称,然后突然崩溃:/i如果我再次运行logcat,它会指向draw方法。感谢您的帮助。好的,那么需要查看更多代码来诊断此问题。需要查看任何修改阵列的代码吗?很清楚,您必须从代码中的某个地方的dustList中删除项目?向我们显示代码a另外,我的代码中有这个for循环。int numSpecs=400;for(int I=0;I