Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 游戏在重新启动时有时会崩溃_Java_Android_Arraylist_Crash_Draw - Fatal编程技术网

Java 游戏在重新启动时有时会崩溃

Java 游戏在重新启动时有时会崩溃,java,android,arraylist,crash,draw,Java,Android,Arraylist,Crash,Draw,大家好,我的社区, 我需要一些帮助。这个ConcurrentModificationException错误让我抓狂!我最近刚刚开始android游戏开发和编程 当我玩我的游戏时,它是完美的,但有时如果我试图开始一个新游戏,它会崩溃。Logcat在我的代码中显示了这两行,但我不知道如何修复它,因为它们在我看来是正确的:/ public void run() { while (playing) { update(); draw(); //the draw-me

大家好,我的社区, 我需要一些帮助。这个ConcurrentModificationException错误让我抓狂!我最近刚刚开始android游戏开发和编程

当我玩我的游戏时,它是完美的,但有时如果我试图开始一个新游戏,它会崩溃。Logcat在我的代码中显示了这两行,但我不知道如何修复它,因为它们在我看来是正确的:/

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