Значение 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"