2011-05-29 66 views
1

基本上我有2类时,“清单”和“BrowserAction”,设置了这样的:的NullReferenceException尝试设置类属性

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,单声道2.6.7为我的框架。

感谢

+0

为什么'browser_action'有一个公共setter?它看起来像一个属性,应该在构造函数中初始化,然后永远不会改变。 – CodesInChaos 2011-05-29 12:33:22

回答

3

你必须在该实例上访问属性之前并初始化browser_action了。

newManifest.browser_action= new BrowserAction(); 
+0

工作完美,谢谢! – mg33 2011-05-29 11:13:23

+0

谢谢。创造了我的一天。这样一件简单的事情花了我1天的时间来弄清楚什么是错的。当你有经验时,你知道什么是错,但是当你是初学者时,这很难。 – Francis 2015-01-28 18:12:51

4

您正在访问新创建的实例newManifest仍然是null财产browser_action

你的榜样更改为类似:

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" 
       } 
     }; 
} 
2

我认为Manifest.browser_action属性返回null,因为你没有初始化它。在访问其属性之前创建一个对象:

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

您已初始化newManifest,但browser_action仍然为空(推测)。

您然后试图设置default_popup对空browser_action并获得异常

newManifest。 browser_action .default_popup =“popup.html”;

4

browser_action尚未初始化。向您的Manifest类添加一个无参数构造函数,如下所示:

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

    public BrowserAction browser_action {get; set;} 
} 
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

您的清单类更改为

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

问题的性质browser_action从未initialiazed!