我有一堂课:
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实例,但效果很好。
答案 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实例分配给矩阵的任何插槽。