Il riferimento non impostato su un'istanza di un oggetto
-
18-09-2019 - |
Domanda
Ho un cellulare di classe:
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; }
}
Allora provo ad usarlo 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 il riferimento non impostato a un'istanza di un oggetto (tra il ///// nel codice precedente ..
Ho provato a generare una singola istanza di cellulare e funziona bene.
Soluzione
Quando si crea un'istanza un array, gli elementi nella matrice ricevono il valore di default 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)
. Così, per i tipi di riferimento array[i]
saranno null
. Questo è il motivo per cui si sta vedendo la 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 il compilatore "dammi un array che può contenere riferimenti a Cell
s", ma non è stato dire al compilatore "dammi un array che può contenere riferimenti a Cell
s e assegnare ciascuno di questi riferimenti a una nuova istanza di Cell
. " Così, il compilatore impostare il valore iniziale di tali riferimenti a null
. Pertanto è necessario inizializzare l'HomeArray
:
for (int i = 0; i < MAXCOL; i++) {
for (int j = 0; j < MAXROW; j++) {
HomeArray[i, j] = new Cell();
}
}
Altri suggerimenti
È 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();
}
}
}
array sono inizializzati essere vuota -. Il riferimento Null è perché HomeArray[i,j]
è nullo, non perché HomeArray[i,j].currentCell
è nullo
UPDATE:. Se si dispone di una dichiarazione in cui un paio di cose diverse potrebbe essere nullo, allora io generalmente diviso che fino in più righe per rendere più facile dire che cosa è nullo
Per esempio, nel tuo caso:
MessageBox.Show(HomeArray[i,j].currentCell.ToString());
In entrambi i HomeArray[i,j]
o HomeArray[i,j].currentCell
potrebbe 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]
è nullo allora si ottiene il NullReferenceException sulla prima linea mentre se cell
è nullo si ottiene sulla seconda riga.
Hai trovato l'eccezione, perché non sta assegnando un caso di cellulare ad uno qualsiasi degli slot dei vostri matrici.