На этом шаге мы рассмотрим определение переменной, которая может принимать значение 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. Результат работы приложения
Напоминаем, что переменная типа 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)
На следующем шаге мы рассмотрим время компиляции и время выполнения.