Actionscript 3 试图删除对象抛出错误1009无法访问空对象引用的属性或方法

Actionscript 3 试图删除对象抛出错误1009无法访问空对象引用的属性或方法,actionscript-3,flash,Actionscript 3,Flash,在一个flash游戏中,在上一个游戏中,我让敌人使用阵列进入,当他们被杀死或移出舞台时,我会将他们从阵列中移除。出于某种原因,当我在这个游戏中使用完全相同的代码时,当我试图删除数组对象时,它抛出一个1009:错误,基本上说那里什么都没有。这很奇怪 代码如下: public function addZombie() { var zom:Zombie = new Zombie(); zom.y = 20; zom.x = Math.floor(Math.random()*(1

在一个flash游戏中,在上一个游戏中,我让敌人使用阵列进入,当他们被杀死或移出舞台时,我会将他们从阵列中移除。出于某种原因,当我在这个游戏中使用完全相同的代码时,当我试图删除数组对象时,它抛出一个1009:错误,基本上说那里什么都没有。这很奇怪

代码如下:

public function addZombie()
{
    var zom:Zombie = new Zombie();
    zom.y = 20;
    zom.x = Math.floor(Math.random()*(1 + 500 - 30)) + 30;
    addChild(zom);
    zombies.push(zom);
    numZombies++;
}
这是它添加到的函数,僵尸是数组,它在这个函数中被推入数组。下面是我试图删除它的代码:

for (var i:int = 0; i < zombies.length; i++)
{
    if (zombies[i].y + zombies[i].height / 2 > 400) {
        removeChild(zombies[i]);
        zombies.splice(i,1);
        numZombies--;
        addZombie();
    }
}
for(变量i:int=0;i400){
removeChild(僵尸[i]);
僵尸。拼接(i,1);
numZombies--;
添加僵尸();
}
}

removeChild(僵尸[i]) 我认为这个循环并没有达到你所期望的效果。以这种方式从数组中删除元素时,删除元素后的所有元素都将下移。因此,如果您有如下代码:

var testArr:Array = new Array();
testArr.push('First');
testArr.push('Second');
testArr.push('Third');
testArr.push('Fourth');

for (var i:int = 0; i < testArr.length; i++) {
    testArr.splice(i,1);
}
最好使用while循环,仅在未删除元素时增加索引(因为删除元素会将新元素移动到该索引位置)


我不明白您为什么会得到空对象引用,但这会导致其他问题(为什么会删除一些但不是全部)。

Bill Turner的解释是正确的,但由于它似乎无法帮助您解决问题,您可能希望尝试以下方法:

var zombieCount:int = zombies.length;

for (var i:int = 0; i < zombies.length; i++)
{
    var zombie = zombies[i];
    if (zombie.y + (zombie.height / 2) > 400) {
        removeChild(zombie);
        zombies.splice(i,1);
        i--; // So that the loop will pass with the same value next time
        numZombies--;
    }
}

for (var j:int = zombies.length; j < zombieCount; j++)
{
    addZombie();
}
var zombieCount:int=zombies.length;
for(变量i:int=0;i400){
removeChild(僵尸);
僵尸。拼接(i,1);
i--;//这样下次循环将以相同的值通过
numZombies--;
}
}
for(var j:int=zombies.length;j
while循环确实会将它们全部删除,但它仍然会每次抛出null对象引用。正如下面所述,我已经找到了null,感谢您的帮助。我认为
removeChild(僵尸[i])没有意义
是引发错误的行。这意味着
僵尸[i]
空的
,这是不可能的,因为您在前一行的测试中已经使用了它,没有任何问题。确实尝试过,但不幸的是,我仍然得到相同的空对象错误。尝试过之后,它仍然在removeChild步骤中触发。如果我将其注释掉,则不会触发任何错误。如果我注释掉其他任何东西,错误仍然会触发。我修复了它,错误实际上存在于僵尸本身的代码中,而根本不存在,真不敢相信我以前没有想到这一点。当僵尸被移除时,我忘记移除EnterFrame。谢谢你的帮助。
var zombieCount:int = zombies.length;

for (var i:int = 0; i < zombies.length; i++)
{
    var zombie = zombies[i];
    if (zombie.y + (zombie.height / 2) > 400) {
        removeChild(zombie);
        zombies.splice(i,1);
        i--; // So that the loop will pass with the same value next time
        numZombies--;
    }
}

for (var j:int = zombies.length; j < zombieCount; j++)
{
    addZombie();
}