Object reference not set to an instance of an object

前端 未结 4 1255
滥情空心
滥情空心 2021-01-18 19:45

I have a class Cell:

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

             


        
相关标签:
4条回答
  • 2021-01-18 20:08

    When you instantiate an array, the items in the array receive the default value for that type. Thus for

    T[] array = new T[length];
    

    it is the case that for every i with 0 <= i < length we have array[i] = default(T). Thus, for reference types array[i] will be null. This is why you are seeing the NullReferenceException. In your case Cell is a reference type so since you have

    HomeArray = new Cell [MAXCOL, MAXROW]; 
    

    and all you have done is establish an array of references to Cells but you never assigned those references to instances of Cell. That is, you told the compiler "give me an array that can hold references to Cells" but you did not tell the compiler "give me an array that can hold references to Cells and assign each of those references to a new instance of Cell." Thus, the compiler will set the initial value of those references to null. Therefore you need to initialize the HomeArray:

    for (int i = 0; i < MAXCOL; i++)  { 
        for (int j = 0; j < MAXROW; j++)  { 
            HomeArray[i, j] = new Cell();
        } 
    }
    
    0 讨论(0)
  • 2021-01-18 20:08

    Arrays are initialised to be empty - the Null reference is because HomeArray[i,j] is null, not because HomeArray[i,j].currentCell is null.

    UPDATE: If you have a statement where a couple of different things could be null, then I generally split that up into multiple lines to make it easier to tell what is null.

    For example, in your case:

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

    Either HomeArray[i,j] or HomeArray[i,j].currentCell could potentially be null and trigger a NullReferenceException - there is no way to tell which it was from the exception. If you split that statement up however:

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

    In this case if HomeArray[i,j] is null then you get your NullReferenceException on the first, line whereas if cell is null you get it on the second line.

    0 讨论(0)
  • 2021-01-18 20:09

    You need to initialize the Cells in your arrays.

    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 讨论(0)
  • 2021-01-18 20:11

    You are getting the exception because you are not assigning an instance of Cell to any of the slots of your matrices.

    0 讨论(0)
提交回复
热议问题