iterator.remove()时将变量设置为null

时间:2015-08-16 05:48:07

标签: java

我正在制作2D射击游戏,在那里你可以射击敌人,它会爆炸。这是我的渲染方法:

public void renderEnemies(Graphics2D g) {
    for (Iterator<Enemy> it = enemies.iterator(); it.hasNext();) {
        Enemy enemy = it.next();
        enemy.render(g);
        if (enemy.die) { // die
            it.remove();
            playSound(4);
            corpses.add(new Corpse(1, enemy.x, enemy.y));
            currentEnemyLife = 0;
        }
        if (enemy.x < 0) { // out of screen
            if (!enemy.die) {
                hero.LIFE--;
            }
            it.remove();
            currentEnemyLife = 0;
        }
    }
}

嗯,我想要做的是,将被删除的敌人设置为null,以便垃圾收集可以将其从JVM中删除。我在enemy = null;执行时尝试添加it.remove();。但它似乎只是删除了我使用enemy创建的变量it.next();,而不是真正的敌人。 我用来添加敌人的方法是enemies.add(new Enemy());

我使用Runtime.getRuntime().totalMemory()检查了记忆,并且它一直在增加直到最大值,游戏崩溃了。

1 个答案:

答案 0 :(得分:1)

it.remove将从enemies集合中删除当前Enemy实例的引用。如果这是对实例的唯一引用,它将有资格进行垃圾回收。没有必要将本地enemy变量设置为null,因为它将在循环的下一次迭代中被覆盖。

你的记忆问题可能在其他地方。删除Enemy时,通常会创建一个Corpse实例。您应该检查corpses集合的大小,看它是否增长太多。