オブジェクト参照がオブジェクトインスタンスに設定されていません
-
18-09-2019 - |
質問
私はクラスのセルを持っています:
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());
///////////////////////////////////////////////////////
}
}
}
}
私は上記のコードで/////間(オブジェクトのインスタンスに設定されていないオブジェクト参照で終わる..
私はセルの単一のインスタンスを作成しようとしたし、それが正常に動作します。
解決
は、配列内の項目は、その型のデフォルト値を受け取ります。したがってのための
T[] array = new T[length];
それはi
を持つすべての0 <= i < length
のために、我々はarray[i] = default(T)
を持っている場合です。このように、参照型のarray[i]
ためnull
されます。あなたがNullReferenceException
を見ている理由です。あなたが
Cell
は、参照型であります
HomeArray = new Cell [MAXCOL, MAXROW];
と、あなたが行っているすべてのCell
sへの参照の配列を確立されていますがCell
のインスタンスにそれらの参照を割り当てられません。それはあなたが「私のCell
sへの参照を保持することができ、配列を与える」コンパイラを語ったが、あなたが私にCell
sへの参照を保持し、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]
がnullではないのでHomeArray[i,j].currentCell
は、ヌルであるため、null参照である
UPDATE:あなたは別の物事のカップルが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の場合cell
がnullの場合は、二行目でそれを得るのに対し、この場合、あなたは最初に、ライン上のあなたとNullReferenceExceptionを取得します。
あなたは行列のスロットのいずれかにセルのインスタンスを割り当てていないので、あなたは例外を取得している。