2013-05-19 3 views
0

저는 C# 초보자이고 계속 'System.NullReferenceException'오류가 발생합니다. 나는 어디에서나 보았지만 유용한 해결책을 찾을 수없는 것 같습니다. 아래 코드를 좀 더 명확하게하기 위해이 코드를 단순화했습니다.개체 참조가 개체의 인스턴스로 설정되지 않았습니다 - C#

namespace tile_test 
{ 
    public class Game1 : Game 
    { 
     public static float bottomWorld = 38400f; 
     public static float rightWorld = 134400f; 
     public static int maxTilesX = (int)rightWorld/16 + 1; 
     public static int maxTilesY = (int)bottomWorld/16 + 1; 


     public Game1() 
     { 
      Tile[,] tile = new Tile[maxTilesX, maxTilesY]; 
      int x = 1; 
      int y = 1; 
      tile[x, y].active = false; //Error on this line. 
     } 
    } 
} 

타일 클래스는 누군가가 나를 도울 수

namespace tile_test 
{ 
    public class Tile 
    { 
     public bool active; 
    } 
} 

아래와 같습니다? 치수가 필요에 대한

답변

2

당신은 당신의 타일 오브젝트를 저장하는 배열을 선언했지만,이 배열의 모든 단일 슬롯이 NULL, 당신은

Tile[,] tile = new Tile[maxTilesX, maxTilesY]; 
int x = 1; 
int y = 1; 
tile[x, y] = new Tile() {active=false}; 

활성 속성을 할당하려고 NULL을 참조 할 수 있으며, 당신은

2

먼저 최초 tile[x, y]

tile[x, y] = new Tile(); 
tile[x, y].active = false; 

를 초기화 당신이 당신의 배열에 저장하려는 모든 타일이 같은 코드가 필요 이는 존재하지 않는 당신이 시도하고 개체의 작업을 수행 할 때 배열의 모든 요소를이지는 당신이 발생하는 유틸리티 메소드

T[,] Create2DimArray<T>(int len1,int len2) where T: new() 
    { 
     T[,] arr = new T[len1, len2]; 
     for (int i = 0; i < len1; i++) 
     { 
      for (int j = 0; j < len2; j++) 
      { 
       arr[i, j] = new T(); 
      } 
     } 
     return arr; 
    } 

을 만들고

Tile[,] tile = Create2DimArray<Tile>(maxTilesX, maxTilesY); 
0

System.NullReferenceException로 사용할 수 있습니다 (null의 값을 가짐) -이 경우 배열의 1,1 위치에있는 타일이 아직 존재하지 않으므로 배열에 올바른 참조의 값 null이 저장됩니다.

시도하고 사용하기 전에 Tiles 배열의 모든 항목을 인스턴스화해야합니다. 배열을 만들 때 아직 참조 할 힙의 객체가 없으므로 모두 null 값을 갖습니다. 한 번에 모든 타일을 만들려면 당신은 배열을 만든 후

간단하게 이루어집니다 : 그냥 알다시피

for (int i = 0; i < maxTilesX; i++) 
{ // loop through "rows" of tiles 
    for (int j = 0; j < maxTilesY; j++) 
    { // loop through corresponding "column" of tiles 
     tile[i, j] = new Tile(); // create a Tile for the array to reference 
     tile[i, j].active = false; // some initialization 
    } 
} 

을, C#을 제로 인덱스 배열을 사용하므로 배열의 첫 번째 항목 사실 tile[0, 0] : 배열에 대한 자세한 내용은 MSDN C# Arrays Tutorial을 참조하십시오. 죄송합니다. 이미 알고 계시다면!

관련 문제