質問

私はクラスのセルを持っています:

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]; 

と、あなたが行っているすべての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();
    } 
}

他のヒント

あなたは配列内のセルを初期化する必要があります。

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を取得します。

あなたは行列のスロットのいずれかにセルのインスタンスを割り当てていないので、あなたは例外を取得している。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top