iTE*_*Egg 5 .net c# 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; }
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试在以下类中使用它:
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());
///////////////////////////////////////////////////////
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最终将Object引用设置为一个对象的实例(在上面的代码中/////之间..
我试过创建一个Cell的单个实例,它工作正常.
jas*_*son 12
实例化数组时,数组中的项将接收该类型的默认值.因此
T[] array = new T[length];
Run Code Online (Sandbox Code Playgroud)
这是每一个的情况下i与0 <= i < length我们有array[i] = default(T).因此,对于参考类型array[i]将是null.这就是你看到的原因NullReferenceException.在你的情况下Cell是一个引用类型,所以你有
HomeArray = new Cell [MAXCOL, MAXROW];
Run Code Online (Sandbox Code Playgroud)
你所做的就是建立一个对Cells 的引用数组,但是你从未将这些引用分配给Cell.也就是说,你告诉编译器"给我一个可以保存对Cells的引用的数组",但你没有告诉编译器"给我一个可以保存对Cells的引用的数组,并将每个引用分配给一个新的实例Cell." 因此,编译器将设置这些引用的初始值null.因此,您需要初始化HomeArray:
for (int i = 0; i < MAXCOL; i++) {
for (int j = 0; j < MAXROW; j++) {
HomeArray[i, j] = new Cell();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7138 次 |
| 最近记录: |