[英]Object reference not set to an instance of an object
我有一堂课:
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实例,并且效果很好。
实例化数组时,数组中的项目会收到该类型的默认值。 因此对于
T[] array = new T[length];
对于每个0 <= i < length
为0 <= i < length
i
,我们都有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();
}
}
}
数组初始化为空HomeArray[i,j]
引用是因为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]
为null,则在第一行得到NullReferenceException,而如果cell
为null,则在第二行得到它。
之所以会出现异常,是因为没有将Cell实例分配给矩阵的任何插槽。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.