C#/Visual Studio 尝试更改随机数组的内容并收到“对象引用未设置为对象的实例”错误

C#/Visual Studio trying to change the content of random array and getting 'Object reference not set to an instance of an object.' error

提问人:coutender 提问时间:2/20/2020 最后编辑:coutender 更新时间:11/20/2020 访问量:64

问:

我正在尝试制作一个井字游戏,用户输入尺寸,然后创建一个带有按钮的棋盘。单击按钮时,该按钮将被禁用,内部文本会相应地更改为“X”或“O”。用户与一个非常基本的“AI”对战,它随机选择按钮。我正在尝试检查板上是否有空(启用)按钮,但出现错误:

System.NullReferenceException:“对象引用未设置为对象的实例。

代码如下:

public partial class Form1 : Form{
   int num; 
   Button[,] buttonspinak;
   private void button2_Click(object sender, EventArgs e)
        {
            int start = 180, end = 30;

            num = Convert.ToInt32(textBox1.Text);
            buttonspinak = new Button[num, num];

                for (int i = 0; i < num; i++)
                {
                    end += 80;
                    start = 180;

                    for (int j = 0; j < num; j++)
                    {
                        Button b = new Button();
                        b.Size = new Size(60, 60);
                        b.Location = new Point(start, end);
                        this.Controls.Add(b);
                        start += 80;
                        b.BackColor = Color.White;
                        buttonspinak[i, j] = b;
                        b.Click += new EventHandler(Computer2);
                        Computer(sender, e);

                    }
                }
            }
   int countercomputer;
        Random randcompu = new Random();
        private void Computer(object sender, EventArgs e)
        {
            int randomi = 0;
            int randomj = 0;
            Button b = (Button)sender;
            b.Enabled = false;
            randomi = randcompu.Next(0, num);
            randomj = randcompu.Next(0, num);
            **while (buttonspinak[randomi, randomj].Text == "O" || buttonspinak[randomi, randomj].Text == "X")** // this is the line where i get the error
            {
                randomi = randcompu.Next(0, num);
                randomj = randcompu.Next(0, num);
                //buttonspinak[randomi, randomj].Text = "C";
            }
            buttonspinak[randomi, randomj].Text = "O";
            b_Elegxos();

        }
private void Computer2(object sender, EventArgs e)
    {
        countercomputer++;
        Button b = (Button)sender;
        b.Enabled = false;
        if (countercomputer % 2 != 0)
        {
            b.Text = "X";
            b.ForeColor = Color.DarkRed;
        }
        b_Elegxos();

    }
}
C# Visual-Studio 异常 NullReferenceException

评论

1赞 JamesS 2/20/2020
这回答了你的问题吗?什么是 NullReferenceException,如何修复它?

答:

0赞 Mark-Danney 2/20/2020 #1

您似乎在处理程序中调用嵌套循环的每次迭代。Computer()forbutton2_Click

这意味着,在仅使用 new 初始化后,会调用 ,它会随机选择一个位置并尝试获取该元素的 .但是,最有可能的是,数组中的该位置尚未初始化,因此您正在尝试调用引用,从而导致异常。buttonspinak[0,0]ButtonComputer()buttonspinakText.Textnull

您应该在循环 in 之后调用 Computer(),这样您就可以确保 中的所有位置都已初始化。forbutton2_Clickbuttonspinak