2010-02-04 18 views
5

Ho una cella classe:riferimento non impostato a un'istanza di un oggetto

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; } 
} 

Poi tenta di utilizzare nella seguente classe:

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()); 
       /////////////////////////////////////////////////////// 

      } 
     } 
    } 
} 

io alla fine con l'Oggetto riferimento non impostato su un'istanza di un oggetto (tra ///// nel codice sopra ..

Ho provato a creare una singola istanza di Cell e funziona perfettamente

+0

Che lingua è? – bmargulies

+0

scusate questo è C# – iTEgg

+0

Ho intenzione di indovinare C# – Albert

risposta

12

Quando si istanzia un array, gli elementi nell'array ricevono il valore predefinito per quel tipo. Così per

T[] array = new T[length]; 

è il caso che per ogni i con 0 <= i < length abbiamo array[i] = default(T). Pertanto, per i tipi di riferimento array[i] sarà null. Questo è il motivo per cui stai vedendo il NullReferenceException. Nel tuo caso Cell è un tipo di riferimento in modo da quando avete

HomeArray = new Cell [MAXCOL, MAXROW]; 

e tutto quello che hanno fatto è stabilire una serie di riferimenti a Cell s ma non avete mai assegnato quei riferimenti alle istanze di Cell. Cioè, hai detto al compilatore "dammi un array che possa contenere riferimenti a Cell s" ma non hai detto al compilatore "dammi un array che possa contenere riferimenti a Cell s e assegnare ognuno di questi riferimenti a una nuova istanza di Cell. " Pertanto, il compilatore imposterà il valore iniziale di tali riferimenti su null. Pertanto è necessario inizializzare il HomeArray:

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

Gli array sono inizializzati per essere vuoti - il riferimento Null è perché HomeArray[i,j] è nullo, non perché HomeArray[i,j].currentCell è nullo.

AGGIORNAMENTO: Se si dispone di un'istruzione in cui un paio di cose diverse potrebbero essere nulle, in genere divido in più righe per rendere più semplice l'indicazione di ciò che è nullo.

Ad esempio, nel tuo caso:

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

Sia HomeArray[i,j] o HomeArray[i,j].currentCell potrebbero potenzialmente essere nullo e innescare un NullReferenceException - non v'è alcun modo per dire che è stata l'eccezione. Se si divide questa affermazione fino però:

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

In questo caso se HomeArray[i,j] è null allora si ottiene il NullReferenceException sulla prima linea mentre se cell è null si ottiene sulla seconda riga.

+0

ho ottenuto la parte: gli array sono inizializzati per essere vuoti. quindi non capisco il resto mi dispiace. per favore, sii così gentile da informarmi ulteriormente – iTEgg

+0

@ikurtz - Ho modificato la mia risposta un po ', è più chiara? – Justin

0

Si sta ottenendo l'eccezione perché non si assegna un'istanza di cella a nessuno degli slot delle matrici.

4

È necessario inizializzare le cellule nel vostro array.

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 ho capito ora. Pensavo che la dichiarazione sarebbe stata sufficiente. grazie a tutti per i vostri buoni consigli. – iTEgg

Problemi correlati