Подтвердить что ты не робот

Ссылка на объект не установлена ​​на экземпляр объекта - как найти имя нарушителя в исключении?

Это проклятие моего программирования. После развертывания приложения, когда эта ошибка возникает, никакая дамп отладки не сообщает вам, что объект WHAT не был создан. У меня есть стек вызовов, это здорово, он говорит мне примерно о том, где находится объект, но есть ли способ заставить .NET указать мне фактическое имя объекта?

Если вы поймаете их во время отладки, конечно, программа ломается прямо на обидном существе, но если это произойдет после того, как программа находится в дикой природе, удачи.

Должен быть способ.

Я изучил исключения, возвращенные в этих экземплярах, и нет ничего полезного.

4b9b3361

Ответ 1

Нет, это невозможно. Исключение происходит, потому что ссылка имеет значение null, а ссылки не имеют имен. Переменные и члены класса/структуры имеют имена, но не уверены, что ссылка хранится в любом из них. Например, ссылку можно создать следующим образом:

someObject.GetInstance().DoSomething();

Если GetInstance метод возвращает нуль, есть пустая ссылка исключение при попытке использовать ссылку для вызова DoSomething. Ссылка - это просто возвращаемое значение из метода, оно не сохраняется в переменной, поэтому нет ничего, чтобы получить имя из.

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

Ответ 2

NullReferenceException является самым злом всех исключений в приложении. Это означает, что ссылка "null-null" не была проверена для нулевого значения до того, как она была доступна.

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

Трассировка стека - ваш единственный друг в этом исключении, где он может по крайней мере определить, какой метод выбрал исключение. Если ваш код достаточно аккуратный, он должен определить небольшой код для проверки.

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


Настоящий ответ заключается в том, чтобы исключить это исключение из ever. Это показатель того, что какой-то код плохо написан, не имея дело со сценарием, где ссылка была null.

Если вы вызываете метод, в котором вам нужно что-то делать с аргументом ссылочного типа, который нужно в какой-то момент отменить, проверьте null и нажмите ArgumentNullException, указав имя параметра

if(parameter == null)
    throw new ArgumentNullException("parameter");

Если вы выполняете операцию внутри класса, и устанавливаемое свойство может быть установлено на null, проверьте перед де-ссылкой на него и введите InvalidOperationException, указывающую на проблему:

if(Property == null)
    throw new InvalidOperationException("Property cannot be null.");

Вы также должны убедиться, что все методы, которые вы вызываете, которые могут возвращать ссылочные типы, гарантированно возвращают значение. Для всех тех, которые не являются, выполните аналогичные проверки для null и соответствующим образом обработайте регистр.

EDIT:

Чтобы уточнить, я не предлагаю вам выполнить проверку каждой переменной ссылочного типа до того, как вы отмените ее. Это было бы безумием.

Это о понимании того, где переменная может быть назначена null и где она не может. Если вы назначаете частное поле в классе ненулевому значению в конструкторе, и значение никогда не назначается снова, вам не нужно проверять, имеет ли значение null; дизайн вашего класса удостоверился, что он никогда не может быть.

Хорошо спроектированный объект ограничит возможности присвоения значений null и будет использовать защитный код, где это необходимо, для исключения исключений, когда может присутствовать значение null.

Ответ 3

Это один из тех случаев, когда вам действительно нужно подключиться к приложению и пройти через общую область кода нарушения, чтобы выяснить, откуда эта нулевая ссылка.

Ответ 4

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

StackTrace: at test_003.Form1.button1_Click(Object sender, EventArgs e) in C:\Documents and Settings\...\Projects\test_003\test_003\Form1.cs:line 52

Если они что-то сделают в будущем по этой проблеме, было бы здорово.