2010-02-23 1 views
1

У меня есть кусок кода:Я получаю System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта при попытке добавить значение массива во время выполнения

EDIT: _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: Объект, не установленный в экземпляр объекта».

Любые мысли были бы весьма признательны!

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

+0

StackTrace было бы полезно ... –

ответ

1

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

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

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

+0

Мне пришлось выбрать один ответ, и Грегз оказался самым конструктивным, помог мне разобраться с проблемой. Проблема была двоякой: 1. RateRuleIds был только для чтения, и разработчик с тех пор изменил его, чтобы разрешить мне доступ. 2. Мне пришлось инициализировать массив RateRuleIds правильно, добавив эту строку в начале моего кода: penParams.RateRuleIds = new Int32 [10]. Размер не имеет значения, поскольку существует конечное количество идентификаторов скорости, которые могут быть предоставлены. Спасибо за вашу помощь, это очень ценится. Ivor – Ivor

+0

@Ivor: Для того, что стоит, разработчик, которому принадлежит свойство RateRuleIds, обычно должен быть ответственным за то, чтобы он был правильно инициализирован, прежде чем подвергаться публичному интерфейсу. Рад, что смог помочь. :) –

0

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

rateRuleIds = new Collection<Int32>(); 
0

выглядит

private Collection<Int32> rateRuleIds; 

не инициализирован к new Collection<Int32>() где-нибудь ...

EDIT:

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

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

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

+0

общественные ProjectionParameters() \t \t { \t \t \t this.rateRuleIds = новая коллекция (); \t \t} Его инициализировано в большом наборе параметров. – Ivor

1

Когда вы на самом деле инициализировать массив:

rateRuleIds = new Collection<Int32>(); 

EDIT:

Так как вы заявили, что вы на самом деле инициализации переменной, то я должен буду доверять вам. Тем не менее, я не совсем уверен, что эта линия:

_penParams.RateRuleIds.Initialize(); 

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

4
private Collection<Int32> rateRuleIds; 

вам нужно initializerateRuleIds как это еще только declared.

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

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

+1

Я думаю, что Ivor уже упоминал, что он фактически инициализирует переменную в другом месте ... – Josh

+1

Если вставленный код является кодом инициализации, он не инициализирует коллекцию (и на самом деле не может), потому что на ' Свойство RateRuleIds'. –

+0

ТАК, эквивалентное правилу «pic or did not happen», это «вставить код или вы его не пишете». – xcud

Смежные вопросы