- Объяснять, что такое
nullи чем обычный тип отличается от типа, допускающего null - Безопасно обрабатывать null с помощью операторов
?.и?: - Понимать, чем опасен оператор
!! - Использовать умные приведения типов (
!= null,is)
В форме регистрации поле «отчество» может остаться пустым, а пользователь может так и не загрузить фото профиля. В программировании состояние «значения нет» обозначается null. В языках вроде Java обращение к переменной, где лежит null, роняет программу с ошибкой NullPointerException, и годами это было одной из самых частых причин падений Android-приложений. Kotlin решает эту проблему уже на этапе компиляции.
Типы, допускающие null
В Kotlin обычные типы не могут хранить null: если написать val name: String = null, компилятор сообщит об ошибке. Чтобы показать, что переменная может быть пустой, к типу добавляют вопросительный знак: String? означает «строка или null». Так сам код говорит, какие значения могут отсутствовать.
fun main() {
val name: String = "Aysel"
var nickname: String? = null
println(name.length)
println(nickname)
nickname = "Ays"
println(nickname)
}5 null Ays
В этой программе нельзя написать nickname.length — компилятор этого не позволит, ведь nickname может быть null. Kotlin заставляет сначала ответить на вопрос: «что делать, если значения нет?». Для этого есть специальные операторы.
Безопасный вызов ?. и оператор Элвис ?:
Безопасный вызов ?. работает так: если значение есть, метод вызывается; если там null, всё выражение просто становится null, и программа не падает. Оператор Элвис ?: возвращает запасное значение справа, когда левая часть равна null. Своё название он получил потому, что знак ?:, повёрнутый набок, напоминает причёску Элвиса Пресли.
fun main() {
val city: String? = null
val country: String? = "Azerbaijan"
println(city?.length)
println(country?.length)
println(city ?: "unknown")
val len = city?.length ?: 0
println("Length: $len")
println(country?.uppercase()?.take(3))
}null 10 unknown Length: 0 AZE
?. можно выстраивать цепочкой; take(3) берёт первые 3 символа.Значения, допускающие null, часто встречаются в реальном коде. Например, toIntOrNull() превращает строку в число, а если это невозможно, возвращает null вместо ошибки — вместе с оператором Элвис это удобный способ проверять то, что ввёл пользователь:
fun main() {
val good = "42".toIntOrNull()
val bad = "forty-two".toIntOrNull()
println(good)
println(bad)
println((bad ?: 0) + 1)
}42 null 1
Оператор !! — «я уверен»
Оператор !! говорит компилятору: «Это значение не null, я уверен». Если ты ошибся, программа тут же упадёт с NullPointerException. Иначе говоря, !! добровольно отключает защиту, которую даёт Kotlin.
val code: String? = "AZ1000"
println(code!!.length) // 6
val empty: String? = null
println(empty!!.length) // crash: NullPointerExceptionУмные приведения типов
После проверки if (email != null) внутри блока Kotlin автоматически считает email обычной String — это называется умным приведением типа (smart cast). То же самое происходит при проверке типа оператором is. Any — общий тип, к которому относится любое значение.
fun main() {
val email: String? = "leyla@example.com"
if (email != null) {
println("Email has ${email.length} characters")
}
val value: Any = 42
val text = when (value) {
is String -> "a string of length ${value.length}"
is Int -> "an Int, doubled: ${value * 2}"
else -> "something else"
}
println(text)
}Email has 17 characters an Int, doubled: 84
is Int значение value уже считается Int, поэтому его можно умножить на 2.| Запись | Название | Что делает |
|---|---|---|
String? | тип, допускающий null | хранит значение или null |
s?.length | безопасный вызов | даёт null, если s равно null |
s ?: "none" | оператор Элвис | подставляет запасное значение вместо null |
s!!.length | утверждение «не null» | при null роняет программу |
Главное
- Обычные типы не хранят
null; типы вродеString?— могут. ?.возвращаетnullвместо падения.?:(Элвис) подставляет запасное значение, если слеваnull:name ?: "guest".!!отключает защиту и при null выбрасывает NullPointerException — избегай его.- После проверки
!= nullилиisкомпилятор сам уточняет тип (smart cast).
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.