Tuesday 30 May 2017

c# - NullReferenceException was unhandled by user code - Object reference not set to instance of an object




I have the following C# classes:




public class Locales
{
public Region region { get; set; }
public Buttons buttons { get; set; }
public Fields fields { get; set; }
}

public class Region
{

public Center center { get; set; }
public East east { get; set; }
}

public class Center
{
public string title { get; set; }
}

public class East

{
public string title { get; set; }
}

public class Buttons
{
public string save { get; set; }
}

public class Fields

{
public Labels labels { get; set; }
}

public class Labels
{
public string firstName { get; set; }
public string lastName { get; set; }
public string chooseLocale { get; set; }
}



To sum up, Locales has Region, Buttons and Fields. Region has Center and East. Center and East have property title. Fields has Labels which has properties firstName, lastName and chooseLocale.



In a method (called GetLocale) I have the following code:



Locale englishLang = new Locale(); 
englishLang.region.center.title = "Center Region";
englishLang.region.east.title = "East Region - Form";
englishLang.buttons.save = "Save";

englishLang.fields.labels.firstName = "First Name";
englishLang.fields.labels.lastName = "Last Name";
englishLang.fields.labels.chooseLocale = "Choose Your Locale";


When I run the code, a "NullReferenceException was unhandled by user code" is thrown at the line : englishLang.region.center.title = "Center Region";



Am I doing something wrong in the way I have set the properties title, save, firstName, lastName and chooseLocale?
I tried adding the following block of code after Locale englishLang = new Locale(); and before englishLang.region.center.title = "Center Region"; but I still get the error message.




Region region = new Region();
Center center = new Center();
East east = new East();
Buttons buttons = new Buttons();
Fields fields = new Fields();
Labels labels = new Labels();


What am I doing wrong?


Answer




Your Locales object never instantiates its properties, nor does the consuming code instantiate them. As reference types, the properties in that class have a default value of null. So when you do this:



Locale englishLang = new Locale();


The following values are null:



englishLang.region
englishLang.buttons
englishLang.fields



Thus, you'll receive a NullReferenceException if you try to de-reference those fields, like you do here:



englishLang.region.center.title = "Center Region";


That line of code attempts to de-reference englishLang.region by referring to its center property. But region is null because it hasn't been instantiated yet.



The best place to instantiate those in the case of these DTO classes would probably be in their constructors. Something like this:




public class Locales
{
public Region region { get; set; }
public Buttons buttons { get; set; }
public Fields fields { get; set; }

public Locales()
{
region = new Region();

buttons = new Buttons();
fields = new Fields();
}
}


That way consuming code doesn't have to do this manually each time, the fields are automatically instantiated by the constructor any time you create an instance of Locales. Naturally, you'll want to repeat this same pattern for your other objects.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...