2012-01-02 108 views
1

我在嘗試爲tilemap創建導入器時在C#中收到此錯誤。它應該讀取像這樣格式化的文件;NullReferenceException,我該如何處理?

DatMapName! 
6|4 
SpritePageID:SpriteID:OffsetX:OffsetY|SpritePageID:SpriteID:OffsetX:OffsetY SpritePageID:SpriteID:OffsetX:OffsetY 
SpritePageID:SpriteID:OffsetX:OffsetY|SpritePageID:SpriteID:OffsetX:OffsetY SpritePageID:SpriteID:OffsetX:OffsetY 

成爲像這樣構建的數據結構;

map 
    MapTile[MapSizeX, MapSizeY] 
     Tile[Sprites on tile] 
     - string SpritePageID 
     - int SpriteID 
     - Vector2 Offset 

基本上它具有第一行,所述第二X/Y尺寸地圖名稱,然後它SpritePageID,spriteID,OFFSETX,OFFSETY由分隔:,和每瓦由分開的多個精靈|。空間分隔不同的瓷磚。

但是,在處理過程中,我得到以下錯誤;

Error 1 Building content threw NullReferenceException: Object reference not set to an instance of an object. 
at LibTilePipelineExtension.LevelProcessor.Process(String input, ContentProcessorContext context) in C:\Projects\C#\XNA1\TileWorld\LibTilePipelineExtension\LevelProcessor.cs:line 45 
at Microsoft.Xna.Framework.Content.Pipeline.ContentProcessor`2.Microsoft.Xna.Framework.Content.Pipeline.IContentProcessor.Process(Object input, ContentProcessorContext context) 
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAssetWorker(BuildItem item) 
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.BuildAsset(BuildItem item) 
at Microsoft.Xna.Framework.Content.Pipeline.BuildCoordinator.RunTheBuild() 
at Microsoft.Xna.Framework.Content.Pipeline.Tasks.BuildContent.RemoteProxy.RunTheBuild(BuildCoordinatorSettings settings, TimestampCache timestampCache, ITaskItem[] sourceAssets, String[]& outputContent, String[]& rebuiltContent, String[]& intermediates, Dictionary`2& dependencyTimestamps, KeyValuePair`2[]& warnings) 
C:\Projects\C#\XNA1\TileWorld\TileWorld\TileWorldContent\tileworldtest1.tilemap TileWorld 

下面是引發此錯誤的代碼。

string[] lines = input.Split(new char[] { '\n' }); 
// ------ 
// Clear out commented lines from the array. Turn it to a list, remove indices, turn back to array. 
List<string> derp1 = new List<string>(lines); 
for (int derp2 = 0; derp2 < derp1.Count; derp2++) { 
    if (derp1[derp2][0] == ' ' || derp1[derp2][0] == ';') { 
     derp1.RemoveAt(derp2); 
     derp2--; 
    } 
} 
lines = derp1.ToArray(); 
// ------ 
int rows = Convert.ToInt32(lines[1].Split('|')[0]); 
int columns = Convert.ToInt32(lines[1].Split('|')[1]); 

MapTile[,] res = new MapTile[rows, columns]; 

for (int i0 = 2; i0 < (rows + 2); i0++) { 
    string[] tiles = lines[i0].Split(' '); 

    for (int i1 = 0; i1 < columns; i1++) { 
     string[] tileSprites = tiles[i1].Split('|'); 
-->  res[i0 - 2, i1].sprites = new Tile[tileSprites.Length]; <-- Exception 

     for (int i2 = 0; i2 < tileSprites.Length; i2++) { 
      string[] spriteData = tileSprites[i2].Split(':'); 

      res[i0 - 2, i1].sprites[i2] = new Tile(spriteData[0], Convert.ToInt32(spriteData[1]), new Vector2(Convert.ToInt32(spriteData[2]), Convert.ToInt32(spriteData[3]))); 
     } 
    } 
} 
return new Map(res, lines[0]); 

這些是我用來製作這棵樹的類。我刪除了使用語句來縮短這個問題。

//Map.cs 
namespace LibTile { 
    public class Map { 
     public MapTile[,] grid { get; set; } 
     public string MapName { get; set; } 

     public Map(MapTile[,] value) { 
      grid = value; 
     } 
     public Map(MapTile[,] value, string name) { 
      grid = value; 
      MapName = name; 
     } 

     public MapTile GetTile(int row, int col) { 
      return grid[row, col]; 
     } 

     public int Rows { 
      get { 
       return grid.GetLength(0); 
      } 
     } 

     public int Columns { 
      get { 
       return grid.GetLength(1); 
      } 
     } 
    } 
} 

//MapTile.cs 
namespace LibTile { 
    public class MapTile { 
     public Tile[] sprites { get; set; } 

     public MapTile(Tile[] value) { 
      sprites = value; 
     } 
    } 
} 

//Tile.cs 
namespace LibTile { 
    public class Tile { 
     public String SpritePageID; 
     public int SpriteID; 
     public Vector2 Offset; 

     public Tile(String spid, int sid, int ox, int oy) { 
      SpritePageID = spid; 
      SpriteID = sid; 
      Offset = new Vector2(ox,oy); 
     } 
     public Tile(String spid, int sid, Vector2 o) { 
      SpritePageID = spid; 
      SpriteID = sid; 
      Offset = o; 
     } 
    } 
} 
+0

什麼是'locals'列表上的null屬性? – annonymously 2012-01-02 21:18:24

回答

0

您創建了一個新的MapTile數組,但您從不初始化各個元素。試試這個:

res[i0 - 2, i1] = new MapTile(new Tile[tileSprites.Length]); 

這將在陣列中的每個poition創建一個新的MapTile對象。不這樣做會導致您的空引用異常。我也會考慮將MapTile的構造函數改爲無參數,然後像以前一樣設置MapTile.sprites

+0

謝謝!這解決了它。我知道這與其中一件事尚未初始化有關,但我從未嘗試過這種變化。構造函數的建議是一個很好的建議。我將添加一個空的構造函數。 – CELLShock 2012-01-02 21:44:30