你调用的对象是空的
我有一节课:
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的实例分配给矩阵的任何插槽。