Открыть сервисСервис

Null — пустое значение в информатике

Null (от лат. nullus — «никакой, нулевой») — специальное значение в информатике, обозначающее отсутствие данных, пустую ссылку или неопределённость. В большинстве языков программирования и реляционных СУБД null служит маркером того, что переменная, поле или выражение не содержит значимого значения, — в отличие от нуля, пустой строки или логического false, которые являются полноценными данными. Семантика null варьируется от системы к системе: в SQL это трёхзначная логика, в Java — ссылочный тип, в JavaScript — примитив, в C — макрос, указывающий на нулевой адрес.

История происхождения

Понятие «отсутствующего значения» возникло вместе с реляционными базами данных. В 1970-х годах Эдгар Кодд, разработавший модель реляционных БД, предложил включить в алгебру отношений особый маркер NULL, чтобы корректно обрабатывать неполные данные — например, неизвестный возраст сотрудника. Кодд обосновал это необходимостью: без NULL пришлось бы использовать «магические» значения (например, −1 для «неизвестно»), что приводило бы к ошибкам вычислений.

В 1980-е годы концепция была реализована в коммерческих СУБД — Oracle, DB2, Informix. Стандарт SQL (ANSI SQL-89, затем SQL-92) закрепил NULL как часть языка запросов, введя трёхзначную логику: помимо истины и лжи появилось состояние «неизвестно».

Null в реляционных базах данных

В SQL NULL означает «значение неизвестно» или «отсутствует». Ключевые свойства:

  • NULL не равно ни одному значению, включая сам NULL: выражение NULL = NULL возвращает NULL, а не TRUE.
  • Арифметические операции с NULL дают NULL: 5 + NULL = NULL.
  • Сравнения NULL > 1, NULL < 1, NULL = 1 возвращают NULL.
  • Для проверки на NULL используется конструкция IS NULL / IS NOT NULL, а не оператор равенства.
  • При сортировке NULL обычно размещается в начале или конце списка (в зависимости от СУБД и настроек).

Для обработки NULL в SQL предусмотрены функции: COALESCE(a, b, c) возвращает первое не-NULL значение, NULLIF(a, b) возвращает NULL, если значения равны, ISNULL / NVL — заменяют NULL на заданное значение.

Null в языках программирования

C и C++

В языке C NULL — это макрос, обычно определяемый как ((void*)0) или 0L, указывающий на нулевой адрес памяти. Разыменование указателя NULL приводит к неопределённому поведению и, как правило, к аварийному завершению программы. В C++11 введён более строгий литерал nullptr — специальный объект типа std::nullptr_t, который нельзя неявно привести к целочисленным типам, что устраняет неоднозначности старого NULL.

Java

В Java null — это значение ссылочного типа, не принадлежащее ни одному классу. Попытка вызвать метод у null вызывает NullPointerException — одно из самых частых исключений в Java-приложениях. Для борьбы с ним в Java 8 появились классы Optional<T>, а в Java 14 — улучшенные сообщения об ошибках, указывающие, какой именно объект оказался null.

JavaScript

В JavaScript null — примитив, обозначающий «намеренно отсутствующее значение». Он отличается от undefined, который означает, что переменная объявлена, но ей не присвоено значение (или свойство объекта не существует). Оператор === строго разделяет оба значения: null === undefined — false, но null == undefined — true (нестрогое сравнение).

Python

В Python аналогом null является None — единственный экземпляр класса NoneType. Идиоматичная проверка — x is None, а не x == None, поскольку оператор is сравнивает идентичность объектов.

SQL-подобные и другие языки

В PHP null — один из восьми примитивов; проверка выполняется через is_null() или === null. В Go отсутствие значения возвращает функция вторым результатом: v, ok := m[key], где ok == false означает, что ключа нет. В Rust аналог — Option<T>, тип с вариантами Some(value) и None.

Философия и критика

Использование null неоднократно критиковалось. Тони Хоар, изобретатель алгоритма быстрой сортировки, в 2009 году назвал null «миллиардной ошибкой», заявив, что изобрёл его в 1965 году для языка ALGOL W и сожалеет об этом. Критики указывают, что null нарушает типобезопасность: компилятор не может проверить, что значение не является null, поэтому ошибки обнаруживаются только во время выполнения. В качестве альтернатив предлагаются типы Option / Maybe (Haskell, Rust, Scala), заставляющие программиста явно обрабатывать отсутствие значения.

Применение

Null применяется везде, где данные могут быть неполными: базы данных (отсутствующие атрибуты), сетевые протоколы (маркер конца данных), файловые форматы (специальные значения-заглушки), пользовательские интерфейсы (пустые поля ввода). В JSON null — один из шести примитивов наряду со строкой, числом, логическим значением, массивом и объектом.

Источники

  • Кодд Э. Ф. «A Relational Model of Data for Large Shared Data Banks» (1970)
  • ISO/IEC 9075:2016 — стандарт SQL
  • Хоар Т. «Null References: The Billion Dollar Mistake» (2009)
  • Страуструп Б. «The C++ Programming Language»
  • Гиллс К. «SQL Pocket Guide» (O'Reilly)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru