Значение null
Значение null в Kotlin представляет отсутствие значения
у переменной. По умолчанию переменные в Kotlin не могут
хранить null, что предотвращает ошибки
при обращении к неинициализированным объектам.
Для объявления переменных, которые могут содержать
null, используется специальный синтаксис
с добавлением знака вопроса после типа.
Объявление nullable-переменных
var name: String? = null
var age: Int? = null
var list: List<String>? = null
Безопасный вызов (?.)
Оператор безопасного вызова ?. позволяет вызывать методы
у объекта только если он не равен null.
Если объект равен null, выражение вернет null:
val text: String? = "hello"
val length: Int? = text?.length
println(length)
Результат выполнения кода:
Int 5
val text: String? = null
val length: Int? = text?.length
println(length)
Результат выполнения кода:
null
Оператор Элвиса (?:)
Оператор Элвиса ?: позволяет указать значение по умолчанию
на случай, если выражение слева равно null:
val text: String? = null
val length: Int = text?.length ?: 0
println(length)
Результат выполнения кода:
Int 0
Оператор утверждения non-null (!!)
Оператор !! преобразует любое значение в non-null тип
и выбрасывает исключение NullPointerException,
если значение равно null:
val text: String? = "hello"
val length: Int = text!!.length
println(length)
Результат выполнения кода:
Int 5
val text: String? = null
try {
val length: Int = text!!.length
println(length)
} catch (e: NullPointerException) {
println("NullPointerException caught")
}
Результат выполнения кода:
String "NullPointerException caught"
Проверка на null в условии
Kotlin автоматически приводит тип к non-null после проверки
на null в условии:
val text: String? = "hello"
if (text != null) {
val length: Int = text.length
println(length)
} else {
println("text is null")
}
Результат выполнения кода:
Int 5
Безопасное приведение типов (as?)
Оператор as? выполняет безопасное приведение типа
и возвращает null, если приведение невозможно:
val obj: Any = "hello"
val str: String? = obj as? String
val num: Int? = obj as? Int
println(str)
println(num)
Результат выполнения кода:
String "hello"
null
Функция let для nullable-типов
Функция let выполняет блок кода только если значение
не равно null:
val text: String? = "hello"
text?.let {
val length = it.length
println("Length: $length")
}
Результат выполнения кода:
String "Length: 5"