Что такое ошибка на миллион долларов (Million Dollar Mistake)?

«Что такое ошибка на миллион долларов (Million Dollar Mistake)?» — вопрос из категории Рендеринг и производительность, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это термин, введённый Тони Хоаром, для обозначения введения концепции null в языки программирования. В контексте Dart и Flutter это приводит к ошибкам времени выполнения, когда код пытается вызвать метод или обратиться к свойству у null-значения (например, NoSuchMethodError).

С введением null safety (Dart 2.12+) система типов помогает предотвратить эти ошибки на этапе компиляции. Переменные по умолчанию не могут быть null, если явно не помечены как nullable с помощью ?.

Пример и безопасная работа с nullable-типами:

String? nullableName; // Может быть String или null
String regularName = 'Flutter'; // Не может быть null

// Опасный вызов — может вызвать ошибку во время выполнения, если nullableName == null
// print(nullableName.length);

// Безопасные подходы:
// 1. Проверка на null (flow analysis)
if (nullableName != null) {
  print(nullableName.length); // В этой области видимости тип — String
}

// 2. Оператор безопасного вызова `?.`
print(nullableName?.length); // Выполнит length, если не null, иначе вернёт null

// 3. Оператор объединения `??` для предоставления значения по умолчанию
print(nullableName?.length ?? 0); // Если null, то использует 0

// 4. Оператор утверждения `!` (используйте с осторожностью, только если уверены)
print(nullableName!.length); // Говорит компилятору: "это не null". Выбросит ошибку, если окажется null.

Основная практика — максимально использовать не-nullable типы и явно обрабатывать nullable случаи через ?, ?? и условные проверки, чтобы ошибки на миллион долларов оставались в прошлом.