作为一项学校作业,我正在尝试使用 C# 在 WinForms 中创建一个数独游戏。数独中的所有内容都必须是面向对象的,所以我没有选择像这样构建代码,老师选择了。
当我在 SudokuGUI 的文本框中放入一个数字 (int) 时,它试图将数字放入数组中但失败了,并给出了众所周知的错误:
An unhandled exception of type 'System.NullReferenceException' occurred in WindowsFormsApplication5.exe Additional information: Object reference not set to an instance of an object.
代码如下所示:
首先,当从 TextBox 释放键时,我们将数字发送到将数字放入数组的方法
private void Valuechange_KeyUp(object sender, KeyEventArgs e) { TextBox text_box = sender as TextBox; var position = tableLayoutPanel1.GetPositionFromControl(text_box); int x = position.Row; int y = position.Column; if (int.TryParse(text_box.Text, out value) && int.Parse(text_box.Text) < 10 && int.Parse(text_box.Text) > 0 || value == 0) { add_value.Array_AddNumber(x, y, value); } else { MessageBox.Show("Skriv in en siffra mellan 1-9"); text_box.Clear(); } }
这是将文本框中的数字添加到保存数字的数组的方法
class Ruta { Siffra number = new Siffra(); public Siffra[,] SudokuArray = new Siffra[9, 9]; public void Array_AddNumber(int x, int y, int value) { SudokuArray[x, y].nummer = value; } }
这里是“Siffra”,在瑞典语中是数字的意思,这是数组的类型
class Siffra { private int _nummer; public int nummer { get { return _nummer; } set { _nummer = value; } } }
我做错了什么,我真的不明白,我的老师也帮不了我:/
这是完整的解决方案: https://dl.dropboxusercontent.com/u/13409794/WindowsFormsApplication5.zip
最佳答案
问题是对这一行的误解:
public Siffra[,] SudokuArray = new Siffra[9,9];
该行在内存中创建了一个新的二维数组对象,空间为 9 项 x 9 项(总共 81 项)。误解是数组中每个点的内容仍然是null
。因此,稍后在您的代码中,当您执行此操作时:
SudokuArray[x,y].nummer = value;
代码首先查找数组引用并使用它来查找位置 (x,y) 处的元素。该值仍然是 null
。然后,代码会使用 null
引用的 nummer
属性。哎呀。你不能那样做。
要修复它,您需要将此代码添加到您的 Ruta
类的构造函数中:
for (int x = 0; x < 9; x++)
for (int y = 0; y < 9; y++)
SudokuArray[x,y] = new Siffra();
关于c# - 将int放入各种对象数组时得到 'NullReferenceException',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21054432/