Введение

Исключения NullPointerException были давней проблемой во многих языках программирования, включая Java. Они возникают, когда мы пытаемся получить доступ к объекту или методу по нулевой ссылке. Kotlin, современный язык программирования, разработанный для устранения недостатков Java, представил функции нулевой безопасности, чтобы помочь разработчикам избежать ужасных исключений NullPointerException. В этом посте мы углубимся в механизмы нулевой безопасности Kotlin и узнаем, как писать более надежный код.

Обнуляемые и необнуляемые типы

В Kotlin типы делятся на две категории: обнуляемые и не обнуляемые. Тип, не допускающий значения NULL, не может содержать нулевое значение, в то время как тип, допускающий значение NULL, может. По умолчанию все типы в Kotlin не допускают значения null. Чтобы сделать тип допускающим значение NULL, добавьте к типу вопросительный знак (?).

Вот пример:

val name: String = "John Doe" // Non-nullable type
val nullableName: String? = null // Nullable type

Оператор безопасного вызова (?.)

Kotlin предоставляет оператор безопасного вызова (?.) для обработки типов, допускающих значение NULL. Оператор безопасного вызова возвращает значение null, если объект, для которого он вызывается, имеет значение null; в противном случае он выполняет указанную операцию.

val length: Int? = nullableName?.length // Returns null if nullableName is null

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

Оператор Элвиса (?:) позволяет указать значение по умолчанию при работе с типами, допускающими значение NULL. Если выражение в левой части оператора не равно нулю, оно возвращается; в противном случае возвращается правостороннее выражение.

val length: Int = nullableName?.length ?: 0 // Returns 0 if nullableName is null

Оператор ненулевого утверждения (!!)

Оператор ненулевого утверждения (!!) используется для преобразования типа, допускающего значение NULL, в тип, не допускающий значение NULL. Будьте осторожны при использовании этого оператора, так как он может привести к NullPointerExceptions, если во время выполнения значение равно null.

val name: String = nullableName!! // Throws NullPointerException if nullableName is null

Безопасный кастинг (как?)

Оператор безопасного приведения (как?) позволяет преобразовать тип, допускающий значение NULL, в тип, не допускающий значения NULL, без создания исключения ClassCastException. Если приведение не удалось, возвращается ноль.

val number: Number? = 42
val intValue: Int? = number as? Int // Returns 42
val floatValue: Float? = number as? Float // Returns null

давайте также применять и запускать Extensions for Null Safety

Kotlin предоставляет несколько функций расширения, которые помогут вам более эффективно работать с типами, допускающими значение NULL. К ним относятся let, также, apply и run.

  • let:выполняет блок кода, только если объект не равен нулю.
nullableName?.let { name ->
    println("Hello, $name!")
}
  • также: Аналогично let, но возвращает объект, для которого он был вызван.
val updatedName = nullableName?.also { name ->
    println("Updating name to ${name.toUpperCase()}")
}.toUpperCase()
  • apply: выполняет блок кода, только если объект не равен null, и возвращает объект, для которого он был вызван.
val newPerson = nullablePerson?.apply {
    age = 25
    name = "John Doe"
}
  • run: выполняет блок кода, только если объект не равен нулю, и возвращает результат блока.
val fullName = nullablePerson?.run {
    "$firstName $lastName"
}

Заключение

Функции нулевой безопасности Kotlin предоставляют мощный способ избежать NullPointerExceptions и написать более надежный и надежный код. Понимая и эффективно используя типы, допускающие значение NULL, операторы безопасного вызова, операторы Элвиса, операторы ненулевого утверждения, безопасное приведение типов и функции расширения, такие как let, also, apply и run, вы можете значительно снизить риск сбоев во время выполнения, вызванных нулевыми ссылками. .

  1. Официальная документация Kotlin по нулевой безопасности
  2. Статья Baeldung о нулевой безопасности в Kotlin