簡體   English   中英

將int放入變體對象數組時獲取“ NullReferenceException”

[英]Getting 'NullReferenceException' when putting int in Array of variety Object

我試圖在WinForms中使用C#作為學校作業創建Sudoku。 數獨中的所有內容都必須是面向對象的,因此老師沒有選擇構建這樣的代碼。

當我在SudokuGUI的文本框中放置一個數字(int)時,它嘗試將數字放置在數組中,但失敗並給我眾所周知的錯誤:

WindowsFormsApplication5.exe中發生了類型為'System.NullReferenceException'的未處理異常。其他信息:對象引用未設置為對象的實例。

代碼如下所示:

  1. 首先,將從文本框釋放鍵時的數字發送到將數字放入數組的方法

     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”,在瑞典語中表示Number,即數組的類型

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

我做錯了什么,我真的不明白,我的老師甚至都幫不了我:/

這是整個解決方案: https : //dl.dropboxusercontent.com/u/13409794/WindowsFormsApplication5.zip

您已將陣列分配為具有可容納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();
       }
    }
}

由於SudukuArray不為null,因此問題(null值)必須是其中的東西。

Siffra是一個類-引用類型。 這意味着默認情況下,它的實例為null(與結構或值類型不同)。

因此,當您創建一個9x9的數組時,您將創建一個9x9的null數組。

剩下的就是功課了。

您正在初始化數組:

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

但切勿創建單個Siffra實例。 因此,當您嘗試訪問一個時,實際上得到的是null 然后,您學嘗試得到一個nummer從空實例......這導致了異常。

在使用數組之前,請對其進行初始化:

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

問題是對這一行的誤解:

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

該行將在內存中創建一個新的二維數組對象,該空間可容納9個項目x 9個項目(總共81個)。 誤解是數組中每個點的內容仍然為null 因此,稍后在您的代碼中,當您這樣做時:

SudokuArray[x,y].nummer = value;

代碼首先查找數組引用,並使用該引用在位置(x,y)處查找元素。 該值仍為null 然后,代碼nummer為使用null引用的nummer屬性。 哎呀。 你不能那樣做。

要修復它,您需要將此代碼添加到您的Ruta類的構造函數中:

for (int x = 0; x < 9; x++)
  for (int y = 0; y < 9; y++)
     SudokuArray[x,y] = new Siffra();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM