Sadjad Johansson
Sadjad Johansson

Reputation: 320

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

Upvotes: 1

Views: 762

Answers (4)

Joel Coehoorn
Joel Coehoorn

Reputation: 416049

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

Upvotes: 1

Steve
Steve

Reputation: 216313

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

Upvotes: 1

poy
poy

Reputation: 10517

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

Upvotes: 1

Robert Horvick
Robert Horvick

Reputation: 4036

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.

Upvotes: 1

Related Questions