2010-02-04 16 views
5

tengo una célula clase:Referencia a objeto no establecida como una instancia de un objeto

public class Cell 
{ 
    public enum cellState 
    { 
     WATER, 
     SCAN, 
     SHIPUNIT, 
     SHOT, 
     HIT 
    } 

    public Cell() 
    { 
     currentCell = cellState.WATER; 
     MessageBox.Show(currentCell.ToString()); 
    } 

    public cellState currentCell { get; set; } 
} 

entonces trato de usarlo en la siguiente clase:

public class NietzscheBattleshipsGameModel 
{ 
    private byte MAXCOL = 10; 
    private byte MAXROW = 10; 

    public Cell[,] HomeArray; 

    private Cell[,] AwayArray; 

    public NietzscheBattleshipsGameModel() 
    { 
     HomeArray = new Cell [MAXCOL, MAXROW]; 

     AwayArray = new Cell [MAXCOL, MAXROW]; 
    } 


    public string alphaCoords(Int32 x) 
    { 
     if (x < 0 || x > 9) 
     { 
      throw new ArgumentOutOfRangeException(); 
     } 

     char alphaChar = (char)('A' + x); 

     return alphaChar.ToString(); 
    } 

    public void test() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      for (int j = 0; j < 10; j++) 
      { 

       // Object reference not set to an instance of an object. 
       MessageBox.Show(HomeArray[i,j].currentCell.ToString()); 
       /////////////////////////////////////////////////////// 

      } 
     } 
    } 
} 

termino con el Objeto referencia no establecida en una instancia de un objeto (entre ///// en el código anterior ...

He intentado crear una sola instancia de Cell y funciona bien.

+0

¿Qué idioma es este? – bmargulies

+0

lo siento es C# – iTEgg

+0

Voy a adivinar C# – Albert

Respuesta

12

Cuando crea una matriz, los elementos de la matriz reciben el valor predeterminado para ese tipo. Así, por

T[] array = new T[length]; 

es el caso que por cada i con 0 <= i < length tenemos array[i] = default(T). Por lo tanto, para los tipos de referencia array[i] será null. Es por eso que está viendo el NullReferenceException. En su caso Cell es un tipo de referencia por lo que ya tiene

HomeArray = new Cell [MAXCOL, MAXROW]; 

y todo lo que hemos hecho es establecer una serie de referencias a Cell s pero nunca se asignó esas referencias a instancias de Cell. Es decir, le dijiste al compilador "dame una matriz que puede contener referencias a Cell s" pero no le dijiste al compilador "dame una matriz que pueda contener referencias a Cell sy asigne cada una de esas referencias a una nueva instancia de Cell. " Por lo tanto, el compilador establecerá el valor inicial de esas referencias en null. Por lo tanto usted necesita para inicializar el HomeArray:

for (int i = 0; i < MAXCOL; i++) { 
    for (int j = 0; j < MAXROW; j++) { 
     HomeArray[i, j] = new Cell(); 
    } 
} 
3

Las matrices se inicializan para estar vacías: la referencia nula se debe a que HomeArray[i,j] es nulo, no porque HomeArray[i,j].currentCell sea nulo.

ACTUALIZACIÓN: Si tiene una declaración en la que un par de cosas diferentes pueden ser nulas, entonces generalmente la divido en varias líneas para que sea más fácil decir lo que es nulo.

Por ejemplo, en su caso:

MessageBox.Show(HomeArray[i,j].currentCell.ToString()); 

De cualquier HomeArray[i,j] o HomeArray[i,j].currentCell podría potencialmente ser nula y desencadenar una NullReferenceException - no hay manera de saber qué fue de la excepción. Si se divide esa declaración hasta al menos:

Cell cell = HomeArray[i,j].currentCell; 
MessageBox.Show(cell.ToString()); 

En este caso si HomeArray[i,j] es nulo, entonces obtendrá su NullReferenceException en la primera, mientras que si la línea cell es nulo se obtiene en la segunda línea.

+0

obtuve la pieza: las matrices se inicializan para estar vacías. entonces no entiendo el resto, lo siento. por favor tenga la amabilidad de informarme más. – iTEgg

+0

@ikurtz - He modificado mi respuesta un poco, ¿está más clara? – Justin

0

Está recibiendo la excepción porque no está asignando una instancia de Cell a ninguno de los espacios de sus matrices.

4

Es necesario para inicializar las células en sus matrices.

public NietzscheBattleshipsGameModel() 
{ 
    HomeArray = new Cell[MAXCOL, MAXROW]; 
    AwayArray = new Cell[MAXCOL, MAXROW]; 

    for (int i = 0; i < MAXROW; i++) 
    { 
     for (int j = 0; j < MAXCOL; j++) 
     { 
      HomeArray[i,j] = new Cell(); 
      AwayArray[i,j] = new Cell(); 
     } 
    } 
} 
+0

ah ok lo tengo ahora. pensé que la declaración de eso sería suficiente. gracias a todos por su buen consejo. – iTEgg

Cuestiones relacionadas