【问题标题】:Getting 'NullReferenceException' when putting int in Array of variety Object将 int 放入各种对象数组时获取“NullReferenceException”
【发布时间】:2014-01-30 00:33:31
【问题描述】:

我正在尝试使用 C# 在 WinForms 中创建数独作为学校作业。数独中的所有内容都必须是面向对象的,所以我没有选择像老师那样构建代码。

当我在 SudokuGUI 的文本框中输入一个数字(整数)时,它会尝试将数字放入数组中但失败并给我一个众所周知的错误:

“System.NullReferenceException”类型的未处理异常 发生在 WindowsFormsApplication5.exe 的附加信息: 对象引用未设置为对象的实例。

代码如下所示:

  1. 首先,我们将按键释放时的数字从 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();
        }
    
    }
    
  2. 这是将文本框中的数字添加到将保存数字的数组的方法

    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;
        }
    }
    
  3. 这里是“Siffra”,在瑞典语中是数字的意思,就是数组的类型

    class Siffra
    {
       private int _nummer;
    
       public int nummer
       {
          get { return _nummer; }
          set { _nummer = value; }
       }
    }
    

我做错了什么,我真的不明白,我的老师也帮不了我:/

这是整个解决方案: https://dl.dropboxusercontent.com/u/13409794/WindowsFormsApplication5.zip

【问题讨论】:

  • 代码的屏幕截图让我们在这里工作很痛苦。将代码复制/粘贴到您的问题中。
  • 如果您觉得需要将整个项目打包并发布给我们,那么您还没有将问题范围缩小到您应该解决的任何地方。
  • @JoelCoehoorn 我用代码替换了图片,如果有人遇到与我相同的新手错误,将更容易找到此线程。
  • @tnw .zip 只是我添加的内容,因为我认为如果您了解全貌,可能会让你们更容易理解我的问题。

标签: c# arrays oop


【解决方案1】:

问题是对这一行的误解:

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# 中工作和理解面向对象编程有点复杂。理论部分很容易阅读和理解,但是当涉及到编程时,对我来说变得更难了,但是感谢您,这对我来说是朝着正确方向迈出的一步!如果你知道任何关于 C# OO 编程实践部分的好视频、书籍或文章,请回击我!再次感谢您
【解决方案2】:

您已将数组分配为可以承载 9x9 Siffra 的大小,这是正确的,但数组中存在的 81 个插槽都是 NULL。

没有包含Siffra 所以,当你的代码执行时

SudokyArray[x,y].nummer = value; 

就像你在写

null.nummer = value; 

当然这是NullReferenceException

某处,可能在您的类Ruta 的构造函数中,您需要用类Siffra 的81 个实例填充数组

class Ruta
{
    public Siffra[,] SudokyArray;

    public Ruta()
    {
       SudokyArray = new Sufra[9,9]
       for(int i = 0; i < 9; i++)
       {
          for(int y = 0; y < 9; y++)
             SudokuArray[i, y] = new Suffra();
       }
    }
}

【讨论】:

  • 感谢您的解释!带有“null.nummer = value;”的部分非常好,让我更容易理解。就像我对你上面的那个人说的那样,理论部分很容易阅读和理解,但是当涉及到编程时,它就变得更难了。非常感谢!
【解决方案3】:

您正在初始化数组:

public Siffra[,] array = new Siffra[9,9];

但从不创建单独的 Siffra 实例。因此,当您尝试访问其中一个时,您实际上得到的是一个null。然后,您尝试从 null 实例中获取 nummer... 这会导致异常。

解决方案

在使用之前初始化数组中的每个实例:

for(int i=0; i<9; i++)
  for(int j=0; j<9; j++)
    array[i,j] = new Siffra();

【讨论】:

    【解决方案4】:

    由于 SudukuArray 不为空,所以问题(空值)一定是其中的东西。

    Siffra 是一个类 - 一个引用类型。这意味着它的实例默认为 null(与结构或值类型不同)。

    因此,当您创建一个 9x9 数组时,您将创建一个 9x9 空数组。

    剩下的就是功课了。

    【讨论】:

    • 非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多