你调用的对象是空的

时间:2010-02-04 18:00:58

标签: c# .net arrays nullreferenceexception

我有一堂课:

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

            }
        }
    }
}

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

我尝试过创建一个Cell实例,但效果很好。

4 个答案:

答案 0 :(得分:12)

实例化数组时,数组中的项目将接收该类型的默认值。因此

T[] array = new T[length];

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

HomeArray = new Cell [MAXCOL, MAXROW]; 

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

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

答案 1 :(得分: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();
        }
    }
}

答案 2 :(得分:3)

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

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

例如,在您的情况下:

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]为null,则在第一行上得到NullReferenceException,而如果cell为null,则在第二行得到它。

答案 3 :(得分:0)

您正在获取异常,因为您没有将Cell实例分配给矩阵的任何插槽。