История эта началась в 1965 году, когда Тони Хоар, создавая типовую систему языка ALGOL W, «изобрёл» NULL-ссылку.
Через полвека он назовёт это «своей миллиардной ошибкой».
Что же такое NULL на самом деле?
- В SQL выражение
NULL = NULLвозвращаетNULL, а неTRUE.
Попытка отсортировать записи по столбцу, содержащемуNULL, приводит к тому, что всеNULL-значения считаются равными,
но их порядок относительно «обычных» значений остаёться на усмотрение конкретной СУБД. - В JavaScript
nullиundefinedстрого различны:null— это явное «ничто», заданное программистом;undefined— автоматическое «ничто», которое получает переменная, не имеющая значения.
Проверить оба состояния можно с помощью
value == null, единственное сравнение, которое истинно и дляnull, и дляundefined. - В C# оператор
!(null-forgiving) позволяет обмануть компилятор, «пообещав», чтоnull!не являетсяnull.
Это не делает значение безопасным, а лишь подавляет предупреждение. - В C/С++
NULL,0и' '(NUL), разные сущности, хотя все они сводятся к нулевому байту.А вот
0x30уже совсем другой символ — ASCII-цифра «0».
Сколько же стоит «ничто»?
С 2009 года (когда впервые прозвучала фраза «Null: The Billion Dollar Mistake») сумма убытков от ошибок, связанных с NULL,
только в банковском секторе превысила 320 млрд долларов. Крупнейшие инциденты:
- 2008 — ошибка в системе
NULL-хэндлинга биржи Tokyo Stock Exchange стоила $400 млн. - 2012 — система Knight Capital потеряла $440 млн из-за «забытого»
NULL-проверяющего условия. - 2020 — в системе COVID-тестирования Великобритании
NULLвместо нуля привёл к недооценке 16 000 случаев.
Как не открыть «дверь» к NULL-ошибке?
- В SQL — всегда использовать
IS NULL / IS NOT NULL, а не= NULL. - В TypeScript включать строгий режим
strictNullChecks. - В Java/Kotlin отдавать предпочтение
Optional<T>и?. let. - В C# 8.0+ применять nullable reference types и избегать
!-оператора без явной необходимости.
NULL, «ступая» на порог наших программ, приносит не только «ничто», но и огромные издержки.
Понимание различий между null, undefined, 0 и отсутствием значения — первый шаг к тому,
чтобы дверь, которую он открывает, вела не к краху, а к надёжному коду без «миллиардных» сюрпризов.