← Назад к вопросам

Что вернется если обратиться к non-null сущности через оператор ?.

1.6 Junior🔥 211 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ

При обращении к non-null сущности через оператор безопасного вызова ?. в Kotlin, результат будет абсолютно идентичен обычному вызову через точку .. Ключевое отличие заключается в том, что оператор ?. предоставляет защиту от NullPointerException (NPE), проверяя, не является ли значение перед ним равным null. Если сущность гарантированно non-null, то проверка проходит успешно, и выполняется указанная операция.

Основное поведение

Оператор ?. действует по следующему принципу:

  • Если значение слева null → возвращает null без выполнения операции справа.
  • Если значение слева не null → выполняется операция справа, и возвращается её результат.

Для non-null сущности второй сценарий выполняется всегда. Пример:

val nonNullString: String = "Hello, World!"
val length = nonNullString?.length  // Вызов через ?.
println(length)  // Выведет: 13

Здесь nonNullString не может быть null, поэтому ?. работает как обычный оператор ., возвращая длину строки (13). NPE не возникает, так как проверка избыточна, но безопасна.

Практический пример с сравнением

Рассмотрим разницу между non-null и nullable переменными:

// Non-null переменная
val nonNull: String = "Kotlin"
val result1 = nonNull?.uppercase()  // Результат: "KOTLIN"
// Эквивалентно nonNull.uppercase()

// Nullable переменная
val nullable: String? = null
val result2 = nullable?.uppercase()  // Результат: null
// Вызова uppercase() не происходит, NPE избежали

Для nonNull использование ?. избыточно, но не ошибочно. В обоих случаях возвращается ожидаемый результат операции (например, преобразованная строка или null для nullable-переменной).

Важные нюансы

  1. Тип результата: При использовании ?. с non-null сущностью, тип результата остаётся non-null, если только сама операция справа не возвращает nullable. Пример:

    val nonNull: String = "text"
    val length: Int? = nonNull?.length  // Тип Int? (из-за ?.), хотя значение всегда Int
    // Лучше использовать nonNull.length для типа Int
    

    Здесь компилятор выводит тип Int?, так как оператор ?. возвращает nullable-тип. Для non-null сущностей это может привести к нежелательной обёртке в nullable.

  2. Идиоматичное использование: В Kotlin для non-null переменных рекомендуется использовать прямой доступ через . без ?., чтобы избежать ненужных nullable-типов и упростить код. Оператор ?. предназначен именно для nullable-переменных (String?, Int? и т.д.).

  3. Цепочки вызовов: ?. часто используется в цепочках для безопасного доступа к свойствам/методам. Для non-null сущностей это работает, но бесполезно:

    data class Person(val name: String, val age: Int)
    val person: Person = Person("Alice", 30)
    val nameLength = person?.name?.length  // Избыточно, но вернёт 5
    

Вывод

  • Возвращаемое значение: Для non-null сущности оператор ?. вернёт результат выполнения операции справа (например, значение свойства, результат метода).
  • Безопасность: NPE не возникнет, так как проверка на null проходит успешно.
  • Рекомендация: Используйте ?. только для nullable-типов. Для non-null типов применяйте обычный доступ через ., чтобы сохранить типобезопасность и чистоту кода. Оператор ?. — это инструмент для работы с потенциально null значениями, а не для всех вызовов.
Что вернется если обратиться к non-null сущности через оператор ?. | PrepBro