简体   繁体   中英

Getting 'NullReferenceException' when putting int in Array of variety Object

I am trying to create a Sudoku in WinForms with C# as a school assignment. Everything in the sudoku MUST be object oriented so I have not chosen to structure the code like this, the teacher did.

When I put a number(int) in a Textbox in the SudokuGUI, it tries to put the number in the arrays but fails and give me the error well known:

An unhandled exception of type 'System.NullReferenceException' occurred in WindowsFormsApplication5.exe Additional information: Object reference not set to an instance of an object.

This is how the code look like:

  1. First we send the Number when keyreleased from the TextBox to the method that will put the number in to the array

     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. Here is the method that will add the number from Textbox to the Array that will hold the numbers

     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. And here is the "Siffra" which means Number in Swedish, that is the the type of the Array

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

What have I done wrong, I really don't understand, my teacher couldn't even help me :/

Here is the whole solution: https://dl.dropboxusercontent.com/u/13409794/WindowsFormsApplication5.zip

You have allocated the array to have a size that can hosts 9x9 Siffra, and that is right, but the 81 slots present in the array are all NULL.

None contains a Siffra so, when your code executes

SudokyArray[x,y].nummer = value; 

it is like you are writing

null.nummer = value; 

of course this is a NullReferenceException

Somewhere, possibly in the constructor of your class Ruta you need to fill the array with 81 instances of the class Siffra

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();
       }
    }
}

Since SudukuArray isn't null, the problem (the null value) must be the thing in it.

Siffra is a class - a reference type. That means instances of it are null by default (unlike structs, or value types).

So when you create a 9x9 array of them, you are creating a 9x9 array of nulls.

The rest is homework.

You are initializing the array:

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

But never creating individual Siffra instances. Therefore, when you attempt to access one, you are actually getting a null . You then attemp to get a nummer from the null instance... which leads to the exception.

Solution

Initialize each instance in the array before you use it:

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

The problem is a misunderstanding of this line:

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

That line creates a new 2-dimensional array object in memory, with space for 9 items x 9 items (81 in total). The misunderstanding is that the contents of each spot in the array is still null . Therefore, later on in your code, when you do this:

SudokuArray[x,y].nummer = value;

The code first looks up the array reference and uses that to find the element at position (x,y). That value is still null . The code then ties to use the nummer property of a null reference. Oops. You can't do that.

To fix it, you need to add this code to the constructor for your Ruta class:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM