Ошибка NullReferenceException
System.NullReferenceException: Object reference not set to an instance of an object значит: программа обратилась к полю, свойству или методу объекта, а объекта нет — в переменной null. Исправление всегда одно из двух: сделать так, чтобы объект был, или проверить на null перед обращением.
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
- Объект не создан. Поле или переменная класса объявлены, но
newне было:Student s = null;, полеprivate List<int> marks;без= new List<int>(). - Элемент массива ссылочного типа (строки, класса — типа, переменная которого хранит ссылку на объект).
new string[3],new Student[10]— все элементыnull, пока их не заполнили. - Метод вернул null.
Console.ReadLine()в конце ввода,FirstOrDefault(), если ничего не нашлось, поиск в словаре, чтение настроек. - В Unity — поле скрипта не заполнено в окне Inspector, или
GetComponent<T>()не нашёл компонент на объекте.
Как исправить
Если объект должен быть — создайте его заранее:
List<int> marks = new List<int>();
string name = "";Если null возможен — проверьте его или задайте значение на этот случай:
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
без имени
Длина: 4a?.B— «еслиaне null, взятьB, иначе null»: ошибки не будет.a ?? b— «a, а если оно null, тоb».if (a != null)илиif (a is not null)— обычная проверка.- Для строк —
string.IsNullOrEmpty(s)иstring.IsNullOrWhiteSpace(s).
Предупреждения компилятора помогают
В проектах .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 сообщение было по-русски: «Ссылка на объект не указывает на экземпляр объекта».