Типы Nullable и Non-Null
Основы системы типов
«Типы Nullable и Non-Null» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Почему важна безопасность при работе с null
Знаменитый NullPointerException привёл к сбою бесчисленного количества программ. Kotlin решает эту проблему напрямую, делая возможность null частью системы типов.
В Kotlin компилятор знает, может ли значение быть равно null, и заставляет Вас обработать такую возможность до возникновения проблем.
Типы, не допускающие null
По умолчанию каждый тип в Kotlin не допускает null. Переменная типа String никогда не может содержать null.
Это гарантируется во время компиляции, поэтому Вы можете свободно использовать значение без проверок.
fun main() {
val name: String = "Alice"
println(name.length)
}Присваивание null запрещено
Попробуйте поместить null в тип, не допускающий null, и компилятор немедленно остановит Вас.
Приведённая ниже строка не скомпилируется, потому что String не принимает null:
val name: String = null→ ошибка
fun main() {
val city: String = "Paris"
// val broken: String = null // compile error
println(city)
}Типы, допускающие null
Чтобы разрешить null, добавьте вопросительный знак после типа: String?.
Это тип, допускающий null. Он может содержать как настоящее значение, так и null.
fun main() {
val maybeName: String? = null
println(maybeName)
}Типы, допускающие null, и типы без null
Эти два объявления выглядят почти одинаково, но ведут себя совершенно по-разному:
val a: String→ никогда не равно nullval b: String?→ может быть равно null
Один символ ? полностью меняет контракт переменной.
fun main() {
val a: String = "hi"
val b: String? = "hi"
println(a)
println(b)
}Компилятор защищает доступ к значениям, допускающим null
Нельзя напрямую вызывать методы у значения, допускающего null. Компилятор запрещает это, потому что значение может быть равно null.
Приведённая ниже закомментированная строка не скомпилировалась бы:
maybe.lengthу типаString?→ ошибка
fun main() {
val maybe: String? = "text"
// println(maybe.length) // compile error
println(maybe)
}Проверка на null
Один из простых способов использовать значение, допускающее null, — явная проверка с помощью if.
Внутри блока if Kotlin знает, что значение не равно null, и позволяет безопасно его использовать.
fun main() {
val maybe: String? = "hello"
if (maybe != null) {
println(maybe.length)
}
}null в параметрах функций
Типы параметров тоже подчиняются этому правилу. Параметр типа String должен получать настоящее значение, а String? принимает null.
Благодаря этому сигнатуры функций сами объясняют, какие значения они принимают.
fun greet(name: String?) {
if (name != null) {
println("Hello, " + name)
} else {
println("Hello, guest")
}
}
fun main() {
greet("Mia")
greet(null)
}Возвращаемые типы, допускающие null
Функции могут возвращать типы, допускающие null, чтобы показать, что результат может отсутствовать.
После этого вызывающий код обязан обработать возможное значение null перед использованием результата.
fun firstChar(text: String?): Char? {
if (text == null || text.isEmpty()) return null
return text[0]
}
fun main() {
println(firstChar("Kotlin"))
println(firstChar(null))
}Автоматический вывод типа
Когда Вы присваиваете литерал, Kotlin автоматически выводит тип, не допускающий null.
val n = "text"→ выведен типString
Чтобы сделать тип допускающим null, необходимо явно объявить его с помощью ?.
fun main() {
val n = "text" // inferred String (non-null)
val m: String? = "text" // explicit nullable
println(n.length)
println(m)
}Объединяем всё
Система типов разделяет значения на две чёткие группы:
- Не допускающие null: всегда безопасны для использования
- Допускающие null: перед использованием требуют обработки
Это различие переносит ошибки, связанные с null, со сбоев во время выполнения на ошибки времени компиляции.
fun main() {
val safe: String = "always here"
val risky: String? = null
println(safe.uppercase())
if (risky != null) println(risky.uppercase()) else println("no value")
}Проверка
Проверьте, насколько хорошо Вы понимаете типы, допускающие и не допускающие null.
Итоги
Вы изучили основы безопасности при работе с null в Kotlin:
- По умолчанию каждый тип не допускает null
- Добавление
?создаёт тип, допускающий null - Компилятор блокирует небезопасный доступ к значениям, допускающим null
- Проверка
if (x != null)позволяет безопасно использовать значение
Далее Вы изучите краткие операторы, которые упрощают работу со значениями, допускающими null.
Часто задаваемые вопросы
Урок «Типы Nullable и Non-Null» бесплатный?
Да — полный текст урока «Типы Nullable и Non-Null» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Типы Nullable и Non-Null»?
Основы системы типов Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Типы Nullable и Non-Null»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Типы Nullable и Non-Null
- Безопасные вызовы и Elvis
- Оператор !!
- Платформенные типы