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.

È stato utile?

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 Cells ma non avete mai assegnato quei riferimenti alle istanze di Cell. Cioè, hai detto il compilatore "dammi un array che può contenere riferimenti a Cells", ma non è stato dire al compilatore "dammi un array che può contenere riferimenti a Cells 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top