0Pricing
Kotlin Academy · Урок

Типы, допускающие null, и модификатор ?

Объявляйте переменные, допускающие null, и разбирайтесь в проверке null в Kotlin во время компиляции.

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

Безопасность null в Kotlin

Kotlin различает типы, которые могут содержать null, и типы, которые не могут, ещё на этапе компиляции. Компилятор предотвращает большинство NullPointerExceptions до запуска программы.

Тип, не допускающий null

По умолчанию тип Kotlin не может иметь значение null. Попробуйте присвоить null — компилятор не позволит это сделать.

fun main() {
    val name: String = "Ada"
    // val nope: String = null // ERROR
    println(name)
}

Тип, допускающий null, с ?

Добавьте ?, чтобы разрешить null. Теперь компилятор рассматривает переменную как потенциально отсутствующую.

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

Вызов методов у значений, допускающих null

Нельзя напрямую вызвать метод у значения, допускающего null, не обработав сначала случай null. Компилятор не позволит это сделать.

fun main() {
    val name: String? = "Bob"
    // println(name.length) // ERROR — name might be null
    if (name != null) println(name.length) // smart cast
}

Умные приведения типов

После проверки if (x != null) Kotlin автоматически рассматривает x как значение, не допускающее null, внутри этой ветви.

fun main() {
    val name: String? = "Alice"
    if (name != null) {
        println("Length: ${name.length}") // safe, smart-cast
    } else {
        println("No name")
    }
}

Параметр функции, допускающий null

Помечайте параметры функции как допускающие null, если они могут отсутствовать. Вызывающая сторона должна явно передать значение или null.

fun greet(name: String?) {
    if (name == null) println("Hello, stranger")
    else println("Hello, $name")
}
fun main() {
    greet("Sara")
    greet(null)
}

Возвращаемый тип, допускающий null

Функция, возвращающая X?, сообщает вызывающей стороне, что может вернуть null, поэтому его необходимо обработать.

fun findUser(id: Int): String? {
    return if (id == 1) "Alice" else null
}
fun main() {
    val u = findUser(2)
    println(u ?: "no user")
}

Свойства, допускающие null

Свойства класса также могут допускать null. Это распространено, когда поля заполняются позднее или загружаются необязательно.

data class Profile(
    val name: String,
    val avatarUrl: String?
)
fun main() {
    val p = Profile("Lee", null)
    println(p.avatarUrl ?: "(no avatar)")
}

Коллекции, допускающие null

Различайте список, допускающий null, List<T>? и список элементов, допускающих null, List<T?>. Это разные вещи.

fun main() {
    val maybeList: List<Int>? = null
    val listOfMaybe: List<Int?> = listOf(1, null, 3)
    println(maybeList?.size)     // null
    println(listOfMaybe.size)    // 3
}

Сравнение с Java

Типы Java, используемые в Kotlin, становятся платформенными типами (String!): Kotlin доверяет Вам, но не предоставляет безопасность null. По возможности всегда аннотируйте API Java с помощью @Nullable/@NotNull.

fun main() {
    val maybeNull: String? = System.getenv("FOO") // null if unset
    println("env FOO = ${maybeNull ?: "(unset)"}")
}

Почему это важно

Безопасность null на этапе компиляции предотвращает целый класс сбоев во время выполнения. Используйте модификатор ?: он документирует намерение и заставляет обрабатывать возможное отсутствие значения.

fun divide(a: Int, b: Int): Int? = if (b == 0) null else a / b
fun main() {
    val r1 = divide(10, 2) // 5
    val r2 = divide(10, 0) // null — handled at call site
    println("$r1, $r2")
}

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

Что означает ? в конце объявления типа?

Итоги

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

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

Урок «Типы, допускающие null, и модификатор ?» бесплатный?

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

Чему я научусь в уроке «Типы, допускающие null, и модификатор ?»?

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

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

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

Сколько времени занимает урок «Типы, допускающие null, и модификатор ?»?

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

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

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

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

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