Start Debugging
2023-10-20 Обновлено 2023-11-05 csharp Edit on GitHub

C# Что такое NullReferenceException и как её исправить?

Узнайте, что вызывает NullReferenceException в C#, как её отлаживать и как предотвращать с помощью проверок на null, оператора null-conditional и ссылочных типов, допускающих null.

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

Вот совсем простой пример:

string myString = null;
int length = myString.Length;

В этом примере у нас есть строковая переменная myString, которой присвоено значение null. Когда мы пытаемся обратиться к её свойству Length, бросается NullReferenceException, потому что нельзя получить длину строки, которой не существует.

Как отлаживать?

Главное — определить источник null-ссылки. Отладчик позволяет максимально точно локализовать место проблемы.

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

Затем проверьте переменные и объекты, наводя на них курсор или используя окна Locals и Watch вашего редактора. Эти инструменты позволяют изучить состояние приложения в момент исключения. Особенно обратите внимание на переменные, используемые в строке, вызвавшей исключение. Если какая-то из них равна null, хотя не должна, скорее всего, источник проблемы найден.

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

Как предотвратить?

Чтобы предотвратить NullReferenceException, критично проверять значения на null до обращения к свойствам или методам объектов. Можно использовать условные операторы, например if, чтобы проверить наличие null перед обращением к членам объекта. Например:

string myString = null; 

if (myString != null) 
{ 
    int length = myString.Length; // This will only execute if 'myString' is not null. 
}

Либо можно использовать оператор null-conditional (введённый в C# 6.0), чтобы безопасно обращаться к членам потенциально null-объектов:

string myString = null; 
int? length = myString?.Length; // 'length' will be null if 'myString' is null.

Ссылочные типы, допускающие null

Ещё один способ избежать NullReferenceException — включить ссылочные типы, допускающие null. Это возможность, появившаяся в C# 8.0. Она помогает разработчикам писать более безопасный и надёжный код, давая возможность явно указать, может ли ссылочный тип (например, классы и интерфейсы) быть null. Это позволяет отлавливать потенциальные null-исключения уже на этапе компиляции и улучшает читаемость и поддерживаемость кода.

Когда вы включаете ссылочные типы, допускающие null, компилятор начинает выдавать предупреждения о потенциальных проблемах с null-ссылками. Чтобы прояснить свои намерения и снизить или убрать эти предупреждения, нужно добавлять соответствующие аннотации.

Ссылочные типы, допускающие null, используют аннотации, чтобы показать, может ли ссылочный тип быть null:

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад