На этом шаге мы поговорим о необходимости обработки null.
Этот шаг занимает анти-null позицию. Мы показали, что эта позиция хороша, но в диком мире программной инженерии представление несуществующего состояния с помощью null - обычное дело.
Почему? Null часто используется в Java и в подобных ему языках как начальное значение переменной. Например, возьмем переменную для хранения имени человека. Есть распространенные имена людей, но нет имени, присваиваемого по умолчанию. Null часто используется как начальное значение переменной, которая не имеет естественного значения. Более того, во многих языках можно объявить переменную без начального значения, и тогда она получит значение по умолчанию null.
Этот подход присваивания null может привести к NullPointerException, что распространено в других языках. Один из путей обхода null - это более внимательное отношение к начальным значениям. Не каждый тип имеет естественное начальное значение, но для строки String такое значение есть - пустая строка. Пустая строка говорит нам то же, что и null: значение еще не создано. Значит, неинициализированное состояние можно представить без проверок на null.
К значениям null можно подойти с другой стороны - принять и использовать приемы, изложенные в предыдущих шагах. Неважно, пользуетесь вы для защиты оператором безопасного вызова или оператором ?:, правильная обработка значения null - необходимое условие для разработчика Kotlin.
Nullness (отсутствие значения) - это феномен из реального мира. Уметь выражать отсутствие значения в Kotlin очень важно. Если вы используете такую возможность в своем коде или вызываете чужой код, который может вернуть null, то делайте это с умом.
Из приведенных шагов вы узнали, как Kotlin справляется с проблемами, связанными о значением null. Вы увидели, что типы с поддержкой null надо объявлять явно, потому что по умолчанию значение null не поддерживается. А когда это возможно, стоит отдавать предпочтение типам, не поддерживающим null, потому что такие значения помогают компилятору предотвращать ошибки.
Были рассмотрены приемы безопасной работы с типами, поддерживающими null, когда без них не обойтись, - с использованием оператора безопасного вызова, оператора ?: или непосредственно проверяя равенство с null. Была рассмотрена функция let и способ ее использования в сочетании с оператором безопасного вызова для вычисления выражений с переменными, способными принимать значение null. Наконец, вы познакомились с исключениями, узнали как их обрабатывать с помощью try/catch, а также как определять условия с целью перехвата исключительных состояний раньше, чем они вызовут сбой.
В следующих шагах вы научитесь работать со строками в языке Kotlin и продолжите работу над таверной в NyetHack.
На следующем шаге мы рассмотрим проверяемые и непроверяемые исключения.