Шаг 65.
Основы Kotlin.
Null-безопасность и исключения. Null-безопасность

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

    Так как Kotlin разграничивает типы с поддержкой и без поддержки null, компилятор знает о возможной опасности обращения к переменной, объявленной с типом, поддерживающим null, когда та может не существовать. Чтобы защититься от такой неприятности, Kotlin запрещает вызывать функции для значений, которые могут принимать значение null, пока вы не возьмете на себя ответственность за эту ситуацию.

    Чтобы понять, как это выглядит на практике, попробуйте вызвать функцию для beverage. У нас модное заведение, поэтому названия напитков должны начинаться с прописной буквы. Попытайтесь вызвать функцию capitalize() для beverage.

fun main() {
    var beverage = readLine().capitalize()
//    beverage = null
    println(beverage)
}
Файл с проектом можно взять здесь.


Рис.1. Использование переменной, способной принимать значение null (Tavern.kt)

    Запустите Tavern.kt. Можно ожидать, что результатом будет модное название напитка с прописной буквы. Но, запустив код, вы увидите ошибку времени компиляции:

  Only safe (?.) on non-null assented (!!.) 
  calls are allowed on a nullable receiver of type String?


Рис.2. Ошибка времени выполнения

    Kotlin не разрешает вызывать функцию capitalize(), потому что вы не разобрались с возможностью beverage принимать значение null. Даже притом что beverage получает из консоли значение, отличное от null, ее тип остался прежним, поддерживающим null. Kotlin прервал компиляцию, обнаружив ошибку использования типа, поддерживающего null, потому что иначе может возникнуть ошибка времени выполнения.

    Сейчас вы, наверное, думаете: "Ну так и что делать с возможностью иметь значение null? Нужно решить важный вопрос с прописной буквой в названии напитка". Есть несколько вариантов безопасной работы с типом, поддерживающим null, и в следующих шагах мы разберем три из них.

    Для начала рассмотрим вариант номер ноль: используйте тип, не поддерживающий null, если это возможно. Такие типы проще в обращении, потому что гарантированно содержат значение, которое можно передавать в функции. Поэтому спросите себя: "Зачем мне тут тип с поддержкой null? Может, тип без поддержки null сработает так же?" Часто тип с поддержкой null просто не нужен. И когда он не нужен, отказ от него - самое верное решение.

    На следующем шаге мы рассмотрим использование оператора безопасного вызова.




Предыдущий шаг Содержание Следующий шаг