Значение null

Значение null в Kotlin представляет отсутствие значения у переменной. По умолчанию переменные в Kotlin не могут хранить null, что предотвращает ошибки при обращении к неинициализированным объектам. Для объявления переменных, которые могут содержать null, используется специальный синтаксис с добавлением знака вопроса после типа.

Объявление nullable-переменных

kotlinvar name: String? = null
var age: Int? = null
var list: List<String>? = null

Безопасный вызов (?.)

Оператор безопасного вызова ?. позволяет вызывать методы у объекта только если он не равен null. Если объект равен null, выражение вернет null:

kotlinval text: String? = "hello"
val length: Int? = text?.length
println(length)

Результат выполнения кода:

kotlinInt 5
kotlinval text: String? = null
val length: Int? = text?.length
println(length)

Результат выполнения кода:

kotlinnull

Оператор Элвиса (?:)

Оператор Элвиса ?: позволяет указать значение по умолчанию на случай, если выражение слева равно null:

kotlinval text: String? = null
val length: Int = text?.length ?: 0
println(length)

Результат выполнения кода:

kotlinInt 0

Оператор утверждения non-null (!!)

Оператор !! преобразует любое значение в non-null тип и выбрасывает исключение NullPointerException, если значение равно null:

kotlinval text: String? = "hello"
val length: Int = text!!.length
println(length)

Результат выполнения кода:

kotlinInt 5
kotlinval text: String? = null
try {
  val length: Int = text!!.length
  println(length)
} catch (e: NullPointerException) {
  println("NullPointerException caught")
}

Результат выполнения кода:

kotlinString "NullPointerException caught"

Проверка на null в условии

Kotlin автоматически приводит тип к non-null после проверки на null в условии:

kotlinval text: String? = "hello"

if (text != null) {
  val length: Int = text.length
  println(length)
} else {
  println("text is null")
}

Результат выполнения кода:

kotlinInt 5

Безопасное приведение типов (as?)

Оператор as? выполняет безопасное приведение типа и возвращает null, если приведение невозможно:

kotlinval obj: Any = "hello"
val str: String? = obj as? String
val num: Int? = obj as? Int

println(str)
println(num)

Результат выполнения кода:

kotlinString "hello"
null

Функция let для nullable-типов

Функция let выполняет блок кода только если значение не равно null:

kotlinval text: String? = "hello"

text?.let {
  val length = it.length
  println("Length: $length")
}

Результат выполнения кода:

kotlinString "Length: 5"

Смотрите также

  • функцию let,
    которая выполняет действия со значениями
  • функцию also,
    которая выполняет дополнительные действия с объектом
  • функцию run,
    которая выполняет блок кода с контекстом объекта