Тип без значения в Kotlin
Большинство выражений в Kotlin имеют тип результата: строка, число, объект. Есть редкий случай, когда выражение не завершается возвратом значения - оно бросает исключение или крутится без конца.
Для таких выражений в языке есть тип Nothing.
У него нет ни одного допустимого значения, зато он
помогает компилятору понимать ветки, где выполнение
обрывается:
fun stopWith(message: String): Nothing {
throw IllegalStateException(message)
}
fun main() {
stopWith("broken rule")
}
Функция stopWith объявлена с результатом
Nothing, потому что после throw
управление не возвращается к вызывающему коду. Любая
попытка использовать результат такой функции как
обычное значение не имеет смысла:
fun requireText(value: String?): String {
return value ?: stopWith("text required")
}
fun stopWith(message: String): Nothing {
throw IllegalStateException(message)
}
fun main() {
println(requireText("ok"))
}
Оператор ?: справа стоит вызов с типом
Nothing. Компилятор знает, что при
null слева программа прервется, а при
ненулевом значении вернется строка. Поэтому вся
функция requireText имеет тип String,
а не объединение со Nothing:
fun pickLabel(code: String?): String {
return code ?: stopWith("code missing")
}
fun stopWith(message: String): Nothing {
throw IllegalArgumentException(message)
}
fun main() {
val label = pickLabel("A-1")
println(label)
}
Сделайте функцию, которая принимает nullable-число
и возвращает обычное число. Если аргумент равен
null, выполнение должно завершиться
ошибкой с вашим текстом. Для 12 выведите
результат.
Напишите функцию без результата, которая всегда
уходит в бесконечный цикл. Укажите у нее тип
Nothing. В main сохраните ссылку
на нее в переменную и убедитесь, что код
компилируется.