5

我有一个班级单元:

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

然后我尝试在以下课程中使用它:

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

            }
        }
    }
}

我最终没有将对象引用设置为对象的实例(在上述代码中的 ///// 之间..

我尝试创建一个 Cell 实例,它工作正常。

4

4 回答 4

12

当您实例化一个数组时,数组中的项目将接收该类型的默认值。因此对于

T[] array = new T[length];

情况i就是0 <= i < length这样array[i] = default(T)。因此,对于引用类型array[i]将是null. 这就是您看到NullReferenceException. 在你的情况下Cell是一个参考类型,所以因为你有

HomeArray = new Cell [MAXCOL, MAXROW]; 

您所做的只是建立一个对Cells 的引用数组,但您从未将这些引用分配给Cell. 也就是说,您告诉编译器“给我一个可以保存对Cells 的引用的数组”,但您没有告诉编译器“给我一个可以保存对Cells 的引用的数组,并将这些引用中的每一个分配给一个新的实例Cell。” 因此,编译器会将这些引用的初始值设置为null. 因此,您需要初始化HomeArray

for (int i = 0; i < MAXCOL; i++)  { 
    for (int j = 0; j < MAXROW; j++)  { 
        HomeArray[i, j] = new Cell();
    } 
}
于 2010-02-04T18:06:27.210 回答
4

您需要初始化数组中的单元格。

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();
        }
    }
}
于 2010-02-04T18:07:27.240 回答
3

数组初始化为空 - Null 引用是因为HomeArray[i,j]为空,而不是因为HomeArray[i,j].currentCell为空。

更新:如果你有一个声明,其中几个不同的东西可能是空的,那么我通常把它分成多行,以便更容易分辨什么是空的。

例如,在您的情况下:

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

要么HomeArray[i,j]HomeArray[i,j].currentCell可能为 null 并触发 NullReferenceException - 无法判断它来自异常。但是,如果您将该语句拆分:

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

在这种情况下,如果HomeArray[i,j]为空,那么您会在第一行获得 NullReferenceException,而如果cell为空,您会在第二行获得它。

于 2010-02-04T18:04:04.413 回答
0

您收到异常是因为您没有将 Cell 的实例分配给矩阵的任何插槽。

于 2010-02-04T18:05:59.800 回答