AS3:又一个1009错误:那个空对象在哪里

时间:2014-07-21 11:30:49

标签: actionscript-3 debugging starling-framework

我有1009错误,但我找不到 null对象。有人能指出我吗?

  

[Fault] exception,information = TypeError:错误#1009:无法访问a   null对象引用的属性或方法。

     

[Fault] exception,information = TypeError:错误#1009:无法访问a   财产或方法   空对象引用。在   Square / draw()[/ Users / si / Dropbox / ac3 / square / src / Square.as:21] at   开始/ drawSquare()[/ Users / si / Dropbox / ac3 / square / src / Start.as:35] at at   starling.events::EventDispatcher/invokeEvent()[/Users/redge/Dropbox/Development/starling/starling/src/starling/events/EventDispatcher.as:146]   在   starling.events::EventDispatcher/dispatchEvent()[/Users/redge/Dropbox/Development/starling/starling/src/starling/events/EventDispatcher.as:117]   在   starling.display ::的DisplayObject / dispatchEvent()[/用户/ REDGE /升降梭箱/开发/八哥/八哥/ SRC /八哥/显示/ DisplayObject.as:398]   在   starling.display ::的DisplayObjectContainer / broadcastEvent()[/用户/ REDGE /升降梭箱/开发/八哥/八哥/ SRC /八哥/显示/ DisplayObjectContainer.as:379]   在   starling.display ::的DisplayObjectContainer / broadcastEventWith()[/用户/ REDGE /升降梭箱/开发/八哥/八哥/ SRC /八哥/显示/ DisplayObjectContainer.as:389]   在   starling.display ::的DisplayObjectContainer / addChildAt()[/用户/ REDGE /升降梭箱/开发/八哥/八哥/ SRC /八哥/显示/ DisplayObjectContainer.as:135]   在   starling.core ::斯塔林/ initializeRoot()[/用户/ REDGE /升降梭箱/开发/八哥/八哥/ SRC /八哥/核心/ Starling.as:439]   在   starling.core ::斯塔林/初始化()[/用户/ REDGE /升降梭箱/开发/八哥/八哥/ SRC /八哥/核心/ Starling.as:410]   在   starling.core ::斯塔林/ onContextCreated()[/用户/ REDGE /升降梭箱/开发/八哥/八哥/ SRC /八哥/核心/ Starling.as:649]

这是明星项目的重要性。

以下是代码:

package {
   import starling.display.*;
   import com.greensock.TweenLite;
   import com.greensock.easing.Linear;

public class Square extends Sprite implements ISquare {

    public const square:Quad = new Quad(100, 100);
    private var direction:Boolean;
    private var stopped:Boolean;
    private var speed:int;

    public function Square() {
    }

    public function draw():void{
        addChild(square);
        square.color = 0x4500FF;
        direction = new Boolean(true);
        stopped = new Boolean(false);
        speed = new int(stage.stageHeight);
        trace("vars init complete");
        down();
    }

   ...

以下是dropbox上的整个资源:https://www.dropbox.com/sh/9x2q93o2ff1fsna/AADVJgt5nipDE1pdkgozkOc1a

1 个答案:

答案 0 :(得分:1)

好的,那么,让我们来看看相关的代码......

开始上课

//stuff omitted like imports
public class Start extends Sprite {

    public var viewport:Quad = new Quad(1,1);
    private var swipe:SwipeGesture;
    private var call:Square = new Square();

    public function Start() {
        super();

        addEventListener(Event.ADDED_TO_STAGE, drawSquare);
    }

    private function drawSquare(event:Event):void {
        removeEventListener(Event.ADDED_TO_STAGE, drawSquare);

        viewport.width = stage.stageWidth;
        viewport.height = stage.stageHeight;
        viewport.color = 0x414141;
        addChild(viewport);

        swipe = new SwipeGesture(viewport);
        swipe.addEventListener(GestureEvent.GESTURE_RECOGNIZED, onSwipe);

        trace("gesture listener added");
        call.draw();
    }
    //stuff omitted
}

方形等级

//imports omitted
public class Square extends Sprite implements ISquare {

    public const square:Quad = new Quad(100, 100);
    private var direction:Boolean;
    private var stopped:Boolean;
    private var speed:int;

    public function Square() {
    }

    public function draw():void{
        addChild(square);
        square.color = 0x4500FF;
        direction = new Boolean(true);
        stopped = new Boolean(false);
        speed = new int(stage.stageHeight);
        trace("vars init complete");
        down();
    }
    //stuff omitted
}

当我手动阅读你的代码时,我发现这就是:

  • Start.constructor添加eventlistener
  • eventListener触发器,start.drawSquare
  • 添加了视口,用swipegesture做了......
  • 绘制正方形
  • Square.draw被称为
  • Square为自己添加四边形
  • 设置一些颜色和变量
  • 方向为真
  • 停止为假
  • 速度为stage.stageHeight

等等,stagestage尚未提及Square。我认为它是空的。事实上,当你查看错误的堆栈跟踪时,你可以看到这一点。它说at Square/draw() in /Users/si/Dropbox/ac3/square/src/Square.as:21出错了。 Square.as的第21行是speed = new int(stage.stageHeight);这表明该行上提到的对象之一为null或未定义。通过消除过程,我们可以看到speed已经被宣布,并且被分配,因此无关紧要;定义int类或编译会出错;我们剩下的就是stage为空或stage.stageHeight未定义。

documentation表示Stage.stageHeight是一个int。它是stage的属性,因为它是一个原始类型,它永远不会为null或以其他方式未定义(无论如何都不在actionscript中)。因此,我们留下stagecall Start的实例从未添加到stage,因此stage为null,因此它在null上

speed = new int(stage.stageHeight)

要解决此问题,请将Square的绘制功能传递给stage ...或者,这似乎是更好的解决方案,给定您要做的事情,添加调用(这是Square实例)在绘制之前暂存。