![](/img/trans.png)
[英]Getting an IndexOutOfRangeException when putting sql into an object array
[英]Getting 'NullReferenceException' when putting int in Array of variety Object
我試圖在WinForms中使用C#作為學校作業創建Sudoku。 數獨中的所有內容都必須是面向對象的,因此老師沒有選擇構建這樣的代碼。
當我在SudokuGUI的文本框中放置一個數字(int)時,它嘗試將數字放置在數組中,但失敗並給我眾所周知的錯誤:
WindowsFormsApplication5.exe中發生了類型為'System.NullReferenceException'的未處理異常。其他信息:對象引用未設置為對象的實例。
代碼如下所示:
首先,將從文本框釋放鍵時的數字發送到將數字放入數組的方法
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”,在瑞典語中表示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.