java在我的代码上抛出java.util.ConcurrentModificationException

时间:2015-03-08 21:34:46

标签: java

我正在制作一个射击游戏作为敌人物体随机向演员射击的项目。但每次敌人随机射击时,都会抛出java.util.ConcurrentModificationException。 这是随机拍摄的代码

public void enemyAttackStrategy() {

    // Fire at when at around the 1/4, 1/2 and 3/4 in a random direction
    int width = Gui.getInstance().getWidth();
    int firstPoint = width / 4 ;
    int secondPoint = firstPoint * 2;
    int thirdPoint = firstPoint * 3;

    int dist = 2;

    boolean nearFirst  = (getX() - firstPoint)  < 3 && (getX() - firstPoint > 0) ;
    boolean nearSecond = (getX() - secondPoint) < 3 && (getX() - secondPoint > 0) ;
    boolean nearThird  = (getX() - thirdPoint)  < 3 && (getX() - thirdPoint > 0);

    if(nearFirst || nearSecond || nearThird){

      //System.out.println("near!!!!!!!!" + (firstPoint) + " " + (secondPoint) + " " + (thirdPoint));
      Game.getInstance().enemyShot();
    }

以及创建敌人花束的代码

public void enemyShot() {
    Bullet bullet = new Bullet("EnemyBullet", "Bullet.png", 14);
    bullets.add(bullet);
    int minSpeed = -15;
    int xPosition = enemyShip.getX();
    int yPosition = enemyShip.getY();
    int xSpeed = random.nextInt(30) + minSpeed;
    int ySpeed = random.nextInt(30) + minSpeed;

    addToWorld(bullet, xPosition, yPosition, xSpeed, ySpeed, 2);

    //System.out.println("Added Enemy Bullet");
}

这是for循环,它引用了我

public void timer() {


    for (Tame oneTame : tames) {
        tame.timeTick();//} 
       }

这是错误

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:886)
at java.util.ArrayList$Itr.next(ArrayList.java:836)
at GameFrameworkJavaFX.Game.timeTick(Game.java:135)

1 个答案:

答案 0 :(得分:2)

如果有两个线程都在修改相同的代码,则可能发生ConcurrentModificationException。如果每个循环都有一个修改数组内容的循环,通常会导致这种情况。有关该特定问题的详细信息,请参阅this question。我不知道这是不是导致问题的原因,但是像@alfasin评论的那样,如果没有看到调用这些方法的代码,我们就无法回答这个问题。

编辑:看到你新发布的代码,看起来很可能就是这种情况。再次,只需查看this question,因为这似乎是其他人具有完全相同类型的错误。