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

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

    Надо любой ценой избегать NullPointerException. Kotlin защищает вас от этого, не позволяя присваивать значение null переменной, тип которой не поддерживает null. Но это не значит, что в Kotlin нет возможности присвоить null. Вот пример из заголовка функции с именем readLine(). Функция readLine() принимает ввод пользователя в консоль и возвращает его, позволяя использовать позже.

  public fun readLine(): String?

    Заголовок readLine() выглядит так же, как и все прочие, за исключением возвращаемого типа String?. Знак вопроса показывает, что тип поддерживает значение null. Это означает, что readLine() вернет значение String или null.

    Удалите экспериментальный код signatureDrink и добавьте вызов readLine(). Сохраните значение, возвращаемое из readLine(), и выведите его.

fun main() {
    var beverage = readLine()
    println(beverage)
}


Рис.1. Объявление переменной со свойством nullable (Tavern.kt)

    Запустите Tavern.kt. Ничего не происходит, потому что программа ждет ввода. Щелкните на окне консоли, введите название напитка, нажмите Enter. Введенное название будет повторно выведено в консоль.


Рис.2. Результат работы приложения


Что если не ввести название напитка и просто нажать Enter? Получит ли beverage значение null? Нет. Этой переменной будет присвоена пустая строка, которая также вернется к вам.

    Напоминаем, что переменная типа String? может содержать строку или null. То есть если переменной beverage присвоить значение null, программа все равно будет скомпилирована. Попробуйте.

fun main() {
    var beverage = readLine()
    beverage = null
    println(beverage)
}


Рис.3. Повторное присвоение null переменной (Tavern.kt)

    Запустите Tavern.kt и, как и раньше, введите напиток на свой вкус. В этот раз неважно, что вы введете, - в консоль будет выведено значение null.


Рис.4. Результат работы приложения

    В этом случае придется вам обойтись без напитка, как, впрочем, и без ошибки.

    Прежде чем двигаться дальше, уберите присваивание null, чтобы ваша таверна могла обслуживать посетителей. IntelliJ предлагает быстрый способ комментирования кода: поместите курсор в любое место в строке с кодом и нажмите Ctrl+/. Комментирование этой строки кода вместо ее удаления даст вам возможность вернуть присваивание null переменной beverage, убрав коментарий (с помощью той же комбинации горячих клавиш). Такой способ позволяет легко испытывать стратегии обработки null, приведенные в дальнейших шагах.

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


Рис.5. Восстанавливаем сервис (Tavern.kt)

    На следующем шаге мы рассмотрим время компиляции и время выполнения.




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