Kotlin Academy · Урок

Безопасный вызов ?. и Elvis ?: в реальном коде

Объединяйте безопасные вызовы в цепочки и задавайте резервные значения с помощью оператора Elvis.

Урок 2 из 413 шагов

«Безопасный вызов ?. и Elvis ?: в реальном коде» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Два оператора с большим влиянием

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

Основы безопасного вызова

x?.member вычисляется как null, если x равен null; в противном случае доступ к member выполняется обычным образом.

fun main() {
    val name: String? = "Kotlin"
    val len: Int? = name?.length
    println(len) // 6
    val nope: String? = null
    println(nope?.length) // null
}

Основы оператора Элвиса

x ?: default возвращает x, если оно не равно null, а в противном случае — значение default справа.

fun main() {
    val name: String? = null
    val display = name ?: "Anonymous"
    println(display) // Anonymous
}

Объединение безопасного вызова и оператора Элвиса

Распространённый идиоматичный вариант: obj?.member ?: default — получить значение или использовать запасной вариант.

fun main() {
    val name: String? = null
    val length = name?.length ?: 0
    println("length = $length") // 0
}

Цепочки безопасных вызовов

Объединяйте несколько ?. в цепочку: всё выражение сразу даёт null, если любое звено равно null.

class Address(val city: String?)
class User(val address: Address?)
fun main() {
    val u: User? = User(Address(null))
    val city = u?.address?.city ?: "Unknown"
    println(city) // Unknown
}

Исключение в правой части оператора Элвиса

Правая часть оператора Элвиса может быть любым выражением, включая throw, что удобно для проверок обязательных значений.

fun loadConfig(path: String?): String {
    val p = path ?: throw IllegalArgumentException("path required")
    return "loaded $p"
}
fun main() {
    println(loadConfig("/etc/app"))
    // loadConfig(null) // throws
}

Безопасный вызов методов

Безопасные вызовы работают с любым методом, а не только с доступом к свойству.

fun main() {
    val raw: String? = "  hello  "
    val cleaned = raw?.trim()?.uppercase() ?: ""
    println(cleaned) // HELLO
}

Безопасный вызов в условиях

Безопасные вызовы можно использовать внутри условий. Объединяйте их с оператором Элвиса, чтобы задать логические значения по умолчанию.

fun main() {
    val name: String? = "Alice"
    if (name?.startsWith("A") == true) {
        println("Starts with A")
    }
}

Оператор Элвиса с return

Используйте оператор Элвиса с return в защитных условиях: завершайте выполнение досрочно, если обязательное значение равно null.

fun process(input: String?) {
    val safe = input ?: return
    println("processing $safe")
}
fun main() {
    process("abc")
    process(null) // returns silently
}

Оператор Элвиса с continue/break

Внутри циклов оператор Элвиса может сразу перейти к continue или break, обеспечивая краткую обработку null.

fun main() {
    val items: List<String?> = listOf("a", null, "b", null, "c")
    for (item in items) {
        val v = item ?: continue
        print("$v ")
    }
    println() // a b c
}

Практика: поиск конфигурации

Безопасный вызов и оператор Элвиса объединяются в одну строку, которая считывает необязательную конфигурацию со значением по умолчанию.

class Config(val timeoutMs: Int?, val host: String?)
fun main() {
    val cfg: Config? = Config(null, "prod.example.com")
    val timeout = cfg?.timeoutMs ?: 5000
    val host = cfg?.host ?: "localhost"
    println("$host @ $timeout ms")
}

Быстрая проверка

Во что вычисляется user?.email ?: "unknown", если user равен null?

Итоги

Объединяйте безопасный вызов (?.) и оператор Элвиса (?:), чтобы писать краткий код с безопасной обработкой null. Используйте оператор Элвиса с throw или return в защитных условиях, которые досрочно завершают выполнение при отсутствии данных.

Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Безопасный вызов ?. и Elvis ?: в реальном коде» бесплатный?

Да — полный текст урока «Безопасный вызов ?. и Elvis ?: в реальном коде» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Безопасный вызов ?. и Elvis ?: в реальном коде»?

Объединяйте безопасные вызовы в цепочки и задавайте резервные значения с помощью оператора Elvis. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Безопасный вызов ?. и Elvis ?: в реальном коде»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Типы, допускающие null, и модификатор ?
  2. Безопасный вызов ?. и Elvis ?: в реальном коде
  3. let, also и run с получателями, допускающими null
  4. Оператор !!: когда и почему его следует избегать
← Назад к Kotlin Academy