【问题标题】:Trying to remove object throws error 1009 cannot access a property or method of null object reference尝试删除对象抛出错误 1009 无法访问空对象引用的属性或方法
【发布时间】:2013-04-04 23:21:09
【问题描述】:

在制作 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++;
}

这就是添加进去的函数,zombies是数组,在这个函数中被压入数组中。这是我试图删除它的代码:

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();
    }
}

removeChild(僵尸[i]);

【问题讨论】:

  • removeChild(zombies[i]); 是引发错误的行对我来说没有意义。这意味着 zombies[i]null 不可能是这种情况,因为您在上一行的测试已经使用它没有任何问题。

标签: actionscript-3 flash


【解决方案1】:

我不相信循环的效果完全符合您的预期。当你以这种方式从数组中移除一个元素时,被移除元素之后的所有元素都会被向下移动。所以,如果你有这样的代码:

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);
}

循环的结果将是:

i=0, testArr = ['Second', 'Third', 'Fourth']
i=1, testArr = ['Second', 'Fourth']
i=2 END OF LOOP

使用 while 循环可能会更好,只有在元素未被移除时才增加索引(因为移除元素会将新元素移动到该索引位置)。

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

【讨论】:

  • while 循环确实将它们全部删除,但它仍然每次都抛出空对象引用。
  • 如下图算出null,谢谢大家的帮助。
【解决方案2】:

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();
}

【讨论】:

  • 试过了,不幸的是我仍然得到同样的空对象错误。
  • 试过了,还是在 removeChild 步骤触发。如果我将其注释掉,则根本不会触发任何错误。如果我完全注释掉其他任何内容,错误仍然会触发。
  • 我修复了它,错误实际上是在僵尸本身的代码中而不是在那里,不敢相信我以前没有考虑过。当僵尸被移除时,我忘记移除 EnterFrame。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 2013-05-16
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多