尝试设置类属性时出现NullReferenceException异常

3
基本上我有两个类,"Manifest"和"BrowserAction",它们的结构如下:
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;}
}

问题是,当我尝试设置Manifest类的browser_action.default_popup实例时,会出现以下情况:
public void setManifest()
{
    Manifest newManifest = new Manifest();
    newManifest.browser_action.default_popup = "popup.html";
}

我遇到了一个System.NullReferenceException的问题。我找了很多资料,但似乎找不到问题所在。对于“Manifest”类中的其他字符串属性等,它可以正常工作。

如果有关的话,我的IDE是MonoDevelop 2.4,框架是Mono 2.6.7。


为什么browser_action有一个公共的setter?它看起来像一个应该在构造函数中初始化并且永远不会改变的属性。 - CodesInChaos
7个回答

4

您正在访问新创建实例newManifest的属性browser_action,但该实例仍为null

请将您的示例更改为以下内容:

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

我假设BrowserAction有一个可公开访问的无参构造函数。
或者一次完成:
public void setManifest()
{
    Manifest newManifest = new Manifest()
        {
            browser_action = new BrowserAction()
                {
                    default_popup = "popup.html"
                }
        };
}

4

browser_action未初始化。请在您的Manifest类中添加一个无参构造函数,例如:

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

    public BrowserAction browser_action {get; set;}
}

3

在访问该实例的属性之前,您还需要初始化browser_action

newManifest.browser_action= new BrowserAction();

谢谢。让我一天都很开心。这么简单的事情,却花了我一天时间才找出问题所在。当你有经验时,你知道问题出在哪里,但当你是初学者时,很难。 - Francis

2
我认为Manifest.browser_action属性返回null是因为您没有初始化它。在访问其属性之前,请创建一个对象:
Manifest newManifest = new Manifest();
newManifest.browser_action = new BrowserAction();
newManifest.browser_action.default_popup = "popup.html";

2
将您的清单类更改为:
public class Manifest
{
    public BrowserAction browser_action { get; set; }
    public Manifest()
    {
        browser_action = new BrowserAction();
    }
}

问题在于属性browser_action从未初始化!

1

引用类型对象的默认值为 null。在使用之前,您需要在 browser_action 属性上创建 BrowserAction 实例。

// 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";

1

你已经初始化了newManifest,但是browser_action仍然为空(可能是这样)。

然后你试图在空的browser_action上设置default_popup,并且得到了异常。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接