Типы, допускающие 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 — локальная установка не требуется.
Все уроки этого курса
- Типы, допускающие null, и модификатор ?
- Безопасный вызов ?. и Elvis ?: в реальном коде
- let, also и run с получателями, допускающими null
- Оператор !!: когда и почему его следует избегать