NullReferenceException при попытке установить свойство класса - PullRequest
2 голосов
/ 29 мая 2011

В основном у меня есть 2 класса, "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 для моей платформы.

Ответы [ 7 ]

4 голосов
/ 29 мая 2011

browser_action не было инициализировано.Добавьте конструктор без параметров в свой класс Manifest следующим образом:

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

    public BrowserAction browser_action {get; set;}
}
4 голосов
/ 29 мая 2011

Вы получаете доступ к свойству browser_action недавно созданного экземпляра newManifest, который по-прежнему 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"
                }
        };
}
3 голосов
/ 29 мая 2011

Вам также придется инициализировать browser_action перед доступом к свойствам в этом экземпляре.

newManifest.browser_action= new BrowserAction();
2 голосов
/ 29 мая 2011

измените класс манифеста на

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

проблема в том, что свойство browser_action никогда не инициализируется!

2 голосов
/ 29 мая 2011

Я думаю, что свойство Manifest.browser_action возвращает ноль, потому что вы его не инициализируете.Создайте объект перед доступом к его свойствам:

Manifest newManifest = new Manifest();
newManifest.browser_action = new BrowserAction();
newManifest.browser_action.default_popup = "popup.html";
1 голос
/ 29 мая 2011

Значением по умолчанию для объекта ссылочного типа является ноль.Вам необходимо создать BrowserAction экземпляр для свойства browser_action перед его использованием.

// 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 голос
/ 29 мая 2011

Вы инициализировали newManifest, но browser_action все еще имеет значение null (предположительно).

Затем вы пытаетесь установить default_popup для null browser_action и получаете исключение

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

...