NullReferenceException when trying to set class pr

2019-02-26 04:06发布

问题:

Basically I have 2 classes, "Manifest" and "BrowserAction", set out like this:

public class BrowserAction
{
    public string default_icon {get; set;}
    public string default_title {get; set;}
    public string default_popup {get; set;}
}


public class Manifest
{
    public BrowserAction browser_action {get; set;}
}

The problem is, that when I try to set an instance of the Manifest class' browser_action.default_popup, like this:

public void setManifest()
{
    Manifest newManifest = new Manifest();
    newManifest.browser_action.default_popup = "popup.html";
}

I get a System.NullReferenceException. I've looked around but I can't seem to find what the problem is. It works fine for other properties of the "Manifest" class that are just strings etc.

If it's relevant, my IDE is MonoDevelop 2.4, with Mono 2.6.7 for my framework.

回答1:

You'll have to intialize browser_action too before accessing properties on that instance.

newManifest.browser_action= new BrowserAction();


回答2:

You are accessing property browser_action of newly created instance newManifest that is still null.

Change your example to something like:

public void setManifest()
{
    Manifest newManifest = new Manifest();
    newManifest.browser_action = new BrowserAction();
    newManifest.browser_action.default_popup = "popup.html";
}

I am assuming that BrowserAction has a public accessible constructor with no arguments.

Or in one go:

public void setManifest()
{
    Manifest newManifest = new Manifest()
        {
            browser_action = new BrowserAction()
                {
                    default_popup = "popup.html"
                }
        };
}


回答3:

browser_action has not been initialized. Add a parameterless constructor to your Manifest class like this:

public class Manifest
{
    public Manifest()
    {
           this.browser_action = new BrowswerAction;
    }

    public BrowserAction browser_action {get; set;}
}


回答4:

I think the Manifest.browser_action property returns null because you don't initialize it. Create an object before accessing its properties:

Manifest newManifest = new Manifest();
newManifest.browser_action = new BrowserAction();
newManifest.browser_action.default_popup = "popup.html";


回答5:

change your manifest class to

public class Manifest
{
    public BrowserAction browser_action { get; set; }
    public Manifest()
    {
        browser_action = new BrowserAction();
    }
}

the problem is the property browser_action never initialiazed!



回答6:

You've initialised newManifest, but browser_action is still null (presumably).

You are then trying to set default_popup on the null browser_action and getting the exception

newManifest.browser_action.default_popup = "popup.html";



回答7:

Default value for reference-type object is null. You need to create BrowserAction instance on browser_action property before using it.

// Create Manifest instance
Manifest newManifest = new Manifest();

Console.Writeline (newManifest.browser_action == null); // Print true;

// Instantiate BrowserAction on browser_action property
newManifest.browser_action = new BrowserAction();

Console.Writeline (newManifest.browser_action == null); // Print false;

// Now you can use browser_action property
newManifest.browser_action.default_popup = "popup.html";