Глиф Учебники

Ошибка NullReferenceException

Справочник · C# · 2 минуты чтения

System.NullReferenceException: Object reference not set to an instance of an object значит: программа обратилась к полю, свойству или методу объекта, а объекта нет — в переменной null. Исправление всегда одно из двух: сделать так, чтобы объект был, или проверить на null перед обращением.

C#
string[] names = new string[3];
names[0] = "Анна";
Console.WriteLine(names[0].Length);
Console.WriteLine(names[1].Length);

Первая строка вывода — 4, а на второй программа остановится:

Текст
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at Program.<Main>$(String[] args) in ...\Program.cs:line 4

В конце сообщения — файл и номер строки, где всё случилось. names[1] никто не заполнил: новый массив строк содержит null, и у null нет длины.

Откуда берётся null

Как исправить

Если объект должен быть — создайте его заранее:

C#
List<int> marks = new List<int>();
string name = "";

Если null возможен — проверьте его или задайте значение на этот случай:

C#
string? name = null;
Console.WriteLine($"Длина: {name?.Length}");
Console.WriteLine($"Длина или 0: {name?.Length ?? 0}");
Console.WriteLine(name ?? "без имени");
if (name != null)
{
    Console.WriteLine(name.ToUpper());
}
name = "Вера";
Console.WriteLine($"Длина: {name?.Length}");
Вывод
Длина:
Длина или 0: 0
без имени
Длина: 4

Предупреждения компилятора помогают

В проектах .NET 6 и новее включены предупреждения о null (<Nullable>enable</Nullable> в .csproj). Тип string? значит «строка или null», а string — «точно не null». Предупреждение Dereference of a possibly null reference (CS8602) показывает строку, где программа может упасть с NullReferenceException, ещё до запуска. Не заглушайте такие предупреждения знаком ! (name!.Length), пока не убедились, что null там действительно невозможен, — лучше добавьте проверку.

Как найти виновника

Если в одной строке несколько обращений через точку (a.B.C.Length), запустите программу с отладкой (F5 в Visual Studio): на ошибке она остановится, и, наведя мышь на каждую часть выражения, видно, какая из них null. Или разбейте строку на несколько и выведите промежуточные значения.

В старом .NET Framework сообщение было по-русски: «Ссылка на объект не указывает на экземпляр объекта».