Итак кейс: выполняется некоторый код, выбрасывается исключение NullReferenceException
со следующим сообщением:
Object reference not set to an instance of an object (В экземпляре объекта не задана ссылка на объект)
Что же это значит, и как исправить код?
Вы пытаетесь воспользоваться чем-то, что равно
null
(или Nothing
в VB.NET). Это означает, что либо вы присвоили это значение, либо вы ничего не присваивали.Как и любое другое значение,
null
может передаваться от объекта к объекту, от метода к методу. Если нечто равно null
в методе "А", вполне может быть, что метод "В" передал это значение в метод "А".Если среда выполнения выбрасывает
NullReferenceException
, то это всегда означает: вы пытаетесь воспользоваться ссылкой. И эта ссылка не инициализирована (или уже не инициализирована).Это означает, что ссылка равна
null
, а вы не сможете вызвать методы через ссылку, равную null
, как тут:string foo = null;
foo.ToUpper();
Этот код выбросит исключение
NullReferenceException
на 2 строке, потому что вы не можете вызвать метод ToUpper()
у ссылки на string
, равной null
.Как определить источник ошибки?
Общие рекомендации: поставьте точки останова в ключевых местах, изучите значения переменных, расположив курсор мыши над переменной, либо открыв панели для отладки: Watch, Locals, Autos.
Если вы хотите определить место, где значение ссылки устанавливается (или нет), нажмите ПКМ на её имени и выберите "Find All References". Затем вы можете поставить точки останова на каждой найденной строке и запустить приложение в режиме отладки. Каждый раз, когда отладчик остановится на точке останова, вы можете удостовериться, что значение верное.
Так вы придёте к месту, где значение ссылки не должно быть
null
, и определите, почему не присвоено верное значение.@csharp_ci