首页 > 解决方案 > 显示项目符号时出现 ConcurrentModificationException

问题描述

我重制了旧的复古游戏“太空射手”我想显示子弹并检查是否被敌人击中

我添加了所有这些,但仍然出现此错误。我确定它是关于子弹的

这里代码:

    trash = new ArrayList<>();

    for (Bullet bullet: bullets){
        if(bullet.y<0){
            trash.add(bullet);}



            bullet.y = bullet.y+ (int)( -70 * screenRatioY);


        for(Enemy enemy: enemies){
            if(Rect.intersects(enemy.getRectangle(), bullet.getRectangle())){
                score++;
                enemyGetShot.start();
                randomShot = random.nextInt(60-30)+30;
                System.out.println("Nowy random shot: "+randomShot);
                bullet.y=-500;
                enemy.y=-500;

            }
        }
    }
    for(Bullet bullet : trash){
        bullets.remove(bullet);}

在绘图部分:

            for (Bullet bullet : bullets) {

                canvas.drawBitmap(bullet.bullet, bullet.x, bullet.y, paint);

            }

如果有人想要子弹课:

    package com.example.space_shooter;
    
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Rect;
    
    import static com.example.space_shooter.GameView.screenRatioX;
    import static com.example.space_shooter.GameView.screenRatioY;
    
    public class Bullet {
        int x,y,width,height;
    
    
        Bitmap bullet;
    
        Bullet(Resources res){
    
            bullet= BitmapFactory.decodeResource(res, R.drawable.bullet4);
            width= bullet.getWidth();
            height= bullet.getHeight();
            width = (int) (width*1.7);
            height = (int) (height*1.7);
    
            width= (int) (width*screenRatioX);
            height= (int) (height* screenRatioY);
    
            bullet= Bitmap.createScaledBitmap(bullet, width,height, true);
    
    
        }
    
        Rect getRectangle(){
            return new Rect(x,y, x+width, y+height);
        }
    }

完整项目:https ://github.com/polonez-byte-112/SpaceShooter

标签: javaandroid

解决方案


当您在执行 remove() 后继续遍历列表时。

您正在同时读取和写入列表,这违反了迭代器的合同(内部用于 forfor循环)。

如果要从列表中删除元素,请使用迭代器(示例代码)。

trash = new ArrayList<>();

    for (final Iterator<Bullet> iterator = trash.iterator(); iterator.hasNext();) {
      final Bullet student = iterator.next();
      iterator.remove();
    }

推荐阅读