2015-05-15 4 views
0

Я получаю ошибку «Ссылка на объект, не установленную на экземпляр объекта», и я не могу тренироваться, потому что я объявляю и создаю объект по всему миру.Получение ссылки на объект не установлена ​​ошибка, когда я уверен, что она установлена ​​

Исключение срабатывает, когда я пытаюсь добавить первый элемент в словарь. Heres мой код:

//declared at the top of my page globally 
Dictionary <String, MyCustomType> MyDictionary = new Dictionary(); 
MyCustomType myCustomType = new MyCustomType(); 

//Then later in a (private void) method: 
//First part of if statement checks if we already have anything in there 
//and if the key already exists. If so, it overwrites it 

if (MyDictionary != null && MyDictionary.ContainsKey(some_string) 
{ 
    // replace the item in the dictionary 
} 
// if the dictionary is null or the key isnt already in the dictionary. 
// This is where it is throwing the exception 
else 
{ 
    MyDictionary.add(some_string, myCustomType) 
} 

При отладке через это делает сказать MyDictionary имеет нулевое значение, но это и следовало ожидать, поскольку я не имею ничего там еще и действовать от оных в заявлении еще ставит что-то в там, так что я действительно не уверен, почему он бросает здесь исключение. Отладка также показывает, что some_string и myCustomType имеют значения, которые я ожидаю от них. Может ли кто-нибудь помочь?

+1

Поскольку у вас есть собственный комментарий, укажите **, если словарь имеет значение null ** или ключ уже не находится в словаре_ затем добавьте значение ключа – dkozl

+0

Да, но это то, где он выбрасывает исключение. Когда я пытаюсь добавить элемент – Ricardinho

+1

В коде содержатся ошибки (например.'new Dictionary()', несовпадающие фигурные скобки). Он не будет компилироваться. – stakx

ответ

2

Держите это просто:

if (MyDictionary == null) MyDictionary = new Dictionary<string, CustomType>(); 
MyDictionary[some_string] = myCustomType; 
+0

Спасибо, я собираюсь переработать мой код, чтобы всегда назначать словарь таким образом. – Ricardinho

+0

Еще лучше было бы объявить MyDictionary как поле readonly, поэтому оно никогда не будет равно null. чем вам не нужно делать нулевую проверку. – Liero

+0

FYI - этот метод работал. Я до сих пор не знаю, как/why /, где мой словарь устанавливается в нуль, но он где-то, и это, по крайней мере, подходит для этого сценария – Ricardinho

1

Вы должны проверить, если MyDictionary является недействительным и создать его экземпляр, если он есть, перед вызовом MyDictionary.add(...

Линия:

Dictionary <String, MyCustomType> MyDictionary = new Dictionary(); 

не будет компилировать, так что я не уверен, что ты на самом деле в вашем коде.

Вам нужно изменить код, чтобы что-то вроде:

if (MyDictionary != null && MyDictionary.ContainsKey(some_string) 
{ 
    ... 
} 
else 
{ 
    if (MyDictionary == null) 
    { 
     MyDictionary = new Dictionary<String, MyCustomType>(); 
    } 
    MyDictionary.Add(some_string, myCustomType); 
} 
0

Я думаю, что вы должны переделать ваш если, как это

if (MyDictionary != null) 
{ 
    if(MyDictionary.ContainsKey(some_string) 
    { 
     // replace the item in the dictionary 
    } 
    // if the dictionary is null or the key isnt already in the dictionary.  This is where it is throwing the exception 
    else 
    { 
     MyDictionary.add(some_string, myCustomType) 
    } 
} 
2

Даже если вы уверены, что у вас нет нулевых ссылок, должно быть одно; иначе вы не получили бы NullReferenceException. Среда выполнения обычно правильна.

  • Вы убедились, что код инициализации myDictionary пробегов на всех?
  • Вы заверили, что инициализация myDictionary всегда запускает до ваш частный метод, который использует его?

Теперь на что-то другое:

myDictionary[key] = value; 

будет работать в обоих случаях, то есть когда словарь еще не имеет записи key, но и тогда, когда уже есть запись для key.

Использование [] имеет преимущество перед вашим текущим двухэтапным процессом (сначала проверьте с помощью ContainsKey, затем Add или обновите) более атомарного; существует меньше риска того, что другой поток будет мешать вашему словарю между двумя шагами. (Хотя, правда, было сказано, если это вообще проблема, вам может быть полезно использовать ConcurrentDictionary.)

+0

Это может быть null, если он устанавливает его на нуль где-то – csharpwinphonexaml

+0

Спасибо @stakx - im собирается обновить мой подход, чтобы всегда использовать MyDictionar [key] = значение – Ricardinho

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