Menu
Coddy logo textTech

Введение в Null-безопасность

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 23 из 110.

Одной из наиболее распространенных причин ошибок в программировании является попытка использовать значение, которое не существует. В Dart это специальное «отсутствие значения» представлено как null. Функция null safety в Dart помогает обнаруживать эти ошибки еще до запуска вашего кода.

Без null safety любая переменная потенциально может быть null, что приводит к сбоям во время выполнения при попытке её использования:

// В старых версиях Dart (без null safety)
String name;  // Может быть null!
print(name.length);  // Сбой, если name равно null

При включенной проверке на null (null safety) (Dart 2.12+), компилятор различает переменные, которые могут содержать null, и те, которые не могут. По умолчанию переменные являются не допускающими значение null (non-nullable) — они всегда должны содержать допустимое значение:

String name = 'Alice';  // Должна иметь значение
print(name.length);     // Безопасно — name никогда не равно null

Компилятор откажется компилировать код, в котором переменная, не допускающая значения null (non-nullable), может иметь значение null. Это переносит обнаружение ошибок со стадии выполнения на стадию компиляции, делая ваши программы более надежными. В следующих уроках вы узнаете, как объявлять типы, допускающие значение null (nullable), когда они вам действительно необходимы, и познакомитесь с операторами, которые предоставляет Dart для безопасной работы с потенциально нулевыми значениями.

challenge icon

Задание

Легко

Давайте создадим простую систему контактных карточек, которая демонстрирует важность не допускающих значения null переменных. Вы создадите систему, в которой каждый контакт должен иметь корректную, гарантированную информацию.

Вы организуете свой код в двух файлах:

  • contact.dart: Определите класс Contact, который представляет контактную информацию человека. Поскольку мы работаем с null safety, каждое поле должно иметь корректное значение — отсутствие данных не допускается! Ваш класс должен содержать:
    • String firstName для имени контакта
    • String lastName для фамилии контакта
    • String email для адреса электронной почты контакта
    • int phoneDigits для количества цифр в номере телефона
    • Конструктор, принимающий все четыре значения
    • Геттер fullName, который возвращает имя и фамилию, объединенные пробелом
    • Метод displayCard(), который выводит информацию о контакте
  • main.dart: Импортируйте ваш класс контакта и создайте два контакта, чтобы продемонстрировать, что все поля гарантированно имеют значения:
    • Создайте контакт с именем 'Emma', фамилией 'Wilson', электронной почтой 'emma@mail.com' и количеством цифр в телефоне 10
    • Создайте контакт с именем 'James', фамилией 'Brown', электронной почтой 'james@work.com' и количеством цифр в телефоне 11
    • Вызовите displayCard() для каждого контакта в указанном выше порядке

Метод displayCard() должен выводить данные именно в таком формате:

--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]

Обратите внимание, что каждая переменная должна быть инициализирована реальным значением — это null safety в действии! Компилятор гарантирует, что при доступе к fullName, email или любому другому полю они всегда будут содержать корректные данные.

Ожидаемый вывод:

--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11

Шпаргалка

Dart использует безопасность null (null safety) для предотвращения ошибок, вызванных использованием несуществующих значений. Специальное значение null представляет отсутствие значения.

При включенной безопасности null (Dart 2.12+), переменные по умолчанию являются не допускающими значение null (non-nullable) — они всегда должны содержать корректное значение:

String name = 'Alice';  // Должна иметь значение
print(name.length);     // Безопасно — name никогда не равно null

Компилятор предотвращает компиляцию кода, если переменная, не допускающая значение null, может оказаться null, перенося обнаружение ошибок со времени выполнения на этап компиляции.

Попробуйте сами

import 'contact.dart';

void main() {
  // TODO: Создайте первый контакт со следующими данными:
  // - имя: 'Emma'
  // - фамилия: 'Wilson'
  // - email: 'emma@mail.com'
  // - количество цифр в номере: 10

  // TODO: Создайте второй контакт со следующими данными:
  // - имя: 'James'
  // - фамилия: 'Brown'
  // - email: 'james@work.com'
  // - количество цифр в номере: 11

  // TODO: Вызовите displayCard() для каждого контакта по порядку
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование