错误1009,MethodInfo-6()

时间:2012-02-10 04:10:35

标签: flash actionscript-3 null nullreferenceexception

感谢stackoverflow社区,我昨天可以解决我的flash项目中的一些问题。我仍然收到错误消息,但它来自网站中的不同行为。这是我收到的错误消息:

  

TypeError:错误#1009:无法访问空对象引用的属性或方法。       在MethodInfo-6()

当我离开雪花(颗粒)落下的页面时,此消息会一次又一次出现。当我返回此页面时,错误消息停止。我的猜测是,当我试图将孩子从父母那里移走时,这与雪花有关。

我也将此错误代码与另一个错误代码混合在一起,但这个代码并不经常出现:

TypeError: Error #1009: Cannot access a property or method of a null object
reference.at Snowflake/update()[C:\Users\JPL\Documents\ranchleblanc\New Ranch
Leblanc\website 2012\Snowflake.as:27]

第27行是以下代码中的第一行:“parent.removeChild(this);”

我一直在互联网上搜索解决这个问题的方法,我被困住了。这是雪花的代码。此影片剪辑正在另一个影片剪辑中播放。

package
{
import flash.display.MovieClip;
import flash.events.Event;

public class Snowflake extends MovieClip
{
    var yVel:Number;
    var xVel:Number;
    var stageheight:Number = 405;

    function Snowflake(xvel:Number, yvel:Number)
    {
        yVel = yvel;
        xVel = xvel;
        this.addEventListener(Event.ENTER_FRAME, update);
    }

    function update(e:Event):void
    {
        this.x += xVel;
        this.y += yVel;

        if (this.y > stageheight)
        {
            this.removeEventListener(Event.ENTER_FRAME, update);
            parent.removeChild(this);
        }
    }
}
}

任何人都可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

替换违规行(27)
if(parent){
   parent.removeChild(this);
   this.removeEventListener(Event.ENTER_FRAME, update);
}

确保父亲实际存在。

你也想删除事件监听器,以防止可怕的内存泄漏。

在MethodInfo-6()

所以,我之前看过那种消息,但已经很久了。 MethodInfo-函数实际上是Flash Player中的内部函数,不应该误解你的错误...如果我的记忆正确地为我服务,我在其他人写的代码中遇到了这个,他们试图用swf执行一个动作还没有加载...或者可能从加载的swf内部执行一个动作,它在调用代码时实际上还没能执行。

所以在这里,让我们看看我们是否可以稍微解决你的问题。

在您的acuiel_fla文件中,您在第1帧上做了很多事情,假设acuiel_fla 是主时间轴,它不会是!尝试这样的事情......

// on frame 1...
// first, check if you even have a stage.  If not, wait to be added!
if(stage){
    init();
}else{
    this.addEventListener(Event.ADDED_TO_STAGE, init);
}


// MOVE THE addEventListener call for ENTER_FRAME here!
function init(e:Event = null):void{
    this.addEventListener(Event.ENTER_FRAME, newFlake);
    this.addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage);
}

// AND REMOVE the ENTER_FRAME listener if you are ever removed
// from the stage.
function removedFromStage(e:Event):void{
    this.removeEventListener(Event.ENTER_FRAME, newFlake);
}

function randRange(low:Number, high:Number):Number
{
    var randNum:Number = Math.random() * (high - low) + low;
    return randNum;
}

//    DO NOT CALL IT HERE.
//this.addEventListener(Event.ENTER_FRAME, newFlake);

function newFlake(e:Event):void
{
    if(!stage) return; // we are not on stage so we can't
                       // do anything here!


    var flake:Snowflake = new Snowflake(randRange(-1,1), randRange(2,5));
    flake.x = Math.random() * stage.stageWidth;
    flake.y = -5;
    flake.alpha = randRange(.3,1);
    flake.scaleX = flake.scaleY = randRange(.3,1);
    addChild(flake);
}

// do not instantiate your new flake here... just leave it for the enterframe.

答案 1 :(得分:1)

尝试:

if(parent)
    parent.removeChild(this);