AS3 - 错误 #1009:无法访问空对象引用的 属性 或方法

AS3 - Error #1009: Cannot access a property or method of a null object reference

我不知道是什么导致了这个错误。我敢肯定这很明显。 (见下面的评论)。

package src.main{

    import src.tilespack.Tile;

    public class Main{

        public var tile:Tile;

        public function Main{
            var t:Tile = Tile.tiles[0]; //Error here

            trace(Tile); //This will also cause an error
        }

平铺:

package src.tilespack{

    public static var tiles:Array = [];

    public static var floorTile:Tile = new FloorTile(0); //Causes an error in FloorTile Class

    public var bitmapData:BitmapData;

    public function Tile(bitmapData:BitmapData, ID:int)
    {
        this.ID = ID;
        tiles[ID] = this;
        this.bitmapData = bitmapData;
    }

}

地砖:

package src.tilespack{
    import src.gfx.Assets;
    import src.tilespack.Tile;

    public class FloorTile extends Tile{ //Error here

        public function FloorTile(ID:int){
            super(Assets.floorTileData, ID);
        }
    }
}

Error #1009: Cannot access a property or method of a null object reference.

我注意到您的代码中存在一些问题:

1) 文件 Tile 没有 class 的定义。可能这只是一个拼写错误,但无论如何,该文件应该类似于:

package src.tilespack
{
    public class Tile
    {
        public static var tiles:Array = [];

        public static var floorTile:Tile = new FloorTile(0); //Causes an error in FloorTile Class

        public var ID:int;
        public var bitmapData:BitmapData;

        public function Tile(bitmapData:BitmapData, ID:int)
        {
            this.ID = ID;
            tiles[ID] = this;
            this.bitmapData = bitmapData;
        }
    }
}

2) 您的代码类似于 "recursive linkage"(抱歉,我不知道官方术语)。您的 class Tile 具有静态变量 floorTile,它会尝试创建 FloorTile class,它本身扩展了 class Tile.

所以我们有一种情况,当 class Tile 试图使用 class FloorTile (因为静态变量应该在第一次 class 使用期间实例化),并且 class FloorTile 尝试使用 class Tile 。这是一个问题。

您可以删除 FloorTile 类型的静态变量或更改 class Tile 的代码以防止使用class FloorTile 在 class Tile 准备工作之前。这是第二种方法的示例:

package src.tilespack
{
    import flash.display.BitmapData;

    public class Tile
    {
        public static var tiles:Array = [];

        private static var _floorTile:Tile;
        public static function get floorTile():Tile
        {
            if (!Tile._floorTile)
            {
                Tile._floorTile = new FloorTile(0);
            }

            return Tile._floorTile;
        }

        public var ID:int;
        public var bitmapData:BitmapData;

        public function Tile(bitmapData:BitmapData, ID:int)
        {
            this.ID = ID;
            tiles[ID] = this;
            this.bitmapData = bitmapData;
        }
    }
}