你调用的对象是空的

我有一节课:

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  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的单个实例,它工作正常。

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

 T[] array = new T[length]; 

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

 HomeArray = new Cell [MAXCOL, MAXROW]; 

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

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

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

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

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

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

例如,在您的情况下:

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

HomeArray[i,j]HomeArray[i,j].currentCell可能都是null并触发NullReferenceException – 无法判断它是exception的。 但是,如果您将该语句拆分为:

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

在这种情况下,如果HomeArray[i,j]为null,则在第一行上得到NullReferenceException,而如果cell为null,则在第二行得到它。

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