5

クラスCellがあります:

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 の単一インスタンスを作成しようとしましたが、正常に動作します。

4

4 に答える 4

12

配列をインスタンス化すると、配列内の項目はその型のデフォルト値を受け取ります。したがって、

T[] array = new T[length];

これは、 for every iwith0 <= i < lengthを持っている場合ですarray[i] = default(T)。したがって、参照型array[i]は になりますnull。これが、 が表示されている理由ですNullReferenceException。あなたの場合Cellは参照型なので、持っているので

HomeArray = new Cell [MAXCOL, MAXROW]; 

sへの参照の配列を確立したCellだけですが、これらの参照を のインスタンスに割り当てたことはありませんCell。つまり、あなたはコンパイラに「s への参照を保持できる配列を与えてください」と言いましたが、コンパイラに「 s への参照を保持できる配列を与えて、それらの参照のそれぞれを の新しいインスタンスに割り当てCellてください」とは言いませんでした。したがって、コンパイラはこれらの参照の初期値を に設定します。したがって、以下を初期化する必要があります。CellCellnullHomeArray

for (int i = 0; i < MAXCOL; i++)  { 
    for (int j = 0; j < MAXROW; j++)  { 
        HomeArray[i, j] = new Cell();
    } 
}
于 2010-02-04T18:06:27.210 に答える
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();
        }
    }
}
于 2010-02-04T18:07:27.240 に答える
3

配列は空に初期化されます。Null 参照は、HomeArray[i,j]null ではなく、null であるためHomeArray[i,j].currentCellです。

更新:いくつかの異なるものが null である可能性があるステートメントがある場合、通常、それを複数の行に分割して、何が null であるかを簡単に判断できるようにします。

たとえば、あなたの場合:

MessageBox.Show(HomeArray[i,j].currentCell.ToString());

HomeArray[i,j]または、null になる可能性があり、NullReferenceException をトリガーする可能性があります。どちらHomeArray[i,j].currentCellが例外からのものかを判断する方法はありません。ただし、そのステートメントを分割すると:

Cell cell = HomeArray[i,j].currentCell;
MessageBox.Show(cell.ToString());

この場合、HomeArray[i,j]null の場合は最初の行で NullReferenceException を取得しますが、cellnull の場合は 2 行目で取得します。

于 2010-02-04T18:04:04.413 に答える
0

Cell のインスタンスを行列のどのスロットにも割り当てていないため、例外が発生しています。

于 2010-02-04T18:05:59.800 に答える