Я получаю System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта при попытке добавить значение в массив во время выполнения - PullRequest
1 голос
/ 23 февраля 2010

У меня есть код:

РЕДАКТИРОВАТЬ: _penParams инициализируются как добавленная строка ниже.

    ProjectionParameters _penParams = new ProjectionParameters();

    [Given(@"Rate Rule List $raterule")]
    public void Rate_Rule_List(Int32 raterule)
    {

        _penParams.RateRuleIds.Initialize();

        _penParams.RateRuleIds.Add(raterule);

    }

Он ссылается на целочисленный массив, определенный как:

        private Collection<Int32> rateRuleIds;
    /// <summary>
    /// A collection of rate rule Ids the member has selected. This is only relevant for an AgeServiceOptions Rates Mode.
    /// </summary>
    public Collection<Int32> RateRuleIds
    {
        get { return rateRuleIds; }
    }

Две вещи произошли:

  1. Метод .Add недоступен для меня, когда я пытаюсь скомпилировать, он был доступен в предыдущем экземпляре, но исчез, поскольку я переключился с работы напрямую с DLL на вызов веб-службы для выполнения моего тестирования. *
  2. Если я пытаюсь получить доступ к какой-либо части массива, любому из его свойств, я получаю ошибку «System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта».

Любые мысли будут с благодарностью!

Кстати: я использую NBehave для разработки простого синтаксиса, позволяющего неопытным людям определять условия конечного пользователя для тестирования.

Ответы [ 5 ]

4 голосов
/ 23 февраля 2010
private Collection<Int32> rateRuleIds;

вам нужно initialize rateRuleIds , так как это всего лишь declared.

Collection<Int32> rateRuleIds = new Collection<int>();

Объявление объекта сообщает компилятору, что этот объект существует, это спецификация и будьте готовы к справиться. Инициализация , на другая рука выделяет память для объект.

1 голос
/ 23 февраля 2010

Ссылка на вашу коллекцию пуста, как правило, в результате сбоя при инициализации коллекции. Пустая ссылка исключение означает, что вы пытаетесь получить доступ к члену на экземпляре, который не существует. (Есть ли причина, по которой вы не инициализируете коллекцию в строке, где вы ее объявляете?)

Основываясь на других комментариях, я подозреваю, что вы не уверены в инициализации. Вы заявляете, что инициализируете this.rateRuleIds в ProjectionParameters(). Вы уверены, что ProjectionParameters() вызывается до того, как вы что-нибудь сделаете с rateRuleIds или RateRuleIds? Если да, то уверены ли вы, что коллекция не вернется к значению NULL?

Я предлагаю в качестве шага устранения неполадок установить точку останова в ProjectionParameters() в указанной вами строке, this.rateRuleIds = new Collection<int>();, и одну в методе доступа RateRuleIds.get. Затем я предлагаю запустить код, чтобы убедиться, что ProjectionParameters действительно выполняется перед тем, как вы получите или используете rateRuleIds. Если оно выполнено, продолжайте шаг за шагом, проверяя, что значение this.rateRuleIds соответствует ожидаемому на каждом этапе, пока вы не встретите свой NullReferenceException.

1 голос
/ 23 февраля 2010

Когда вы фактически инициализируете свой массив:

rateRuleIds = new Collection<Int32>();

EDIT:

Поскольку вы заявили, что на самом деле инициализируете переменную, мне придется вам доверять. Однако я не совсем уверен, что это за строка:

_penParams.RateRuleIds.Initialize();

Является ли Initialize() каким-либо методом расширения? Потому что это не часть класса Collection .

0 голосов
/ 23 февраля 2010

выглядит как

 private Collection<Int32> rateRuleIds;

нигде не инициализируется new Collection<Int32>() ...

EDIT:

так вы говорите, что инициализировали коллекцию. Так действительно ли _penParams инициализирован?

Почему вы не можете отладить код и посмотреть, в чем проблема?

Поставьте точку останова на код, где инициализируется коллекция, и убедитесь, что она вызывается. Поместите точку останова на линию, которая падает, и осмотрите переменную, чтобы определить, какая из них равна нулю.

0 голосов
/ 23 февраля 2010

Вы когда-нибудь инициализировали свою коллекцию так:

rateRuleIds = new Collection<Int32>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...