Avatar ·

Что такое null/nil в Kotlin и как с ним работать?

Всем привет! Начал изучать Kotlin после Java и никак не могу до конца разобраться с концепцией null в этом языке. В Java null — это обычная ссылка, которая может быть присвоена любому объекту, и мы постоянно боремся с NullPointerException. В Kotlin же, как я понял, типы по умолчанию non-null, и для работы с null нужно использовать специальные конструкции.

У меня есть несколько конкретных вопросов и проблем:

  1. Правильно ли я понимаю, что String? (с вопросительным знаком) — это nullable тип, а String — non-null? И если я попытаюсь присвоить null переменной типа String без вопросительного знака, то будет ошибка компиляции?
  2. Я попробовал написать простой код, но он не компилируется:
fun main() {
    val name: String? = null
    println(name.length) // Ошибка: Only safe (?.) or non-null asserted (!!.) calls are allowed
}

Я ожидал, что будет выброшено исключение во время выполнения, как в Java, но компилятор не дает даже запустить код. Как правильно обратиться к свойству nullable переменной?

  1. Я знаю про операторы ?. (safe call), !! (not-null assertion) и ?: (elvis). Но когда какой использовать? Например, я хочу получить длину строки или вернуть -1, если строка null. Какой способ считается идиоматичным в Kotlin?

Пробовал читать документацию, но примеры там слишком простые. Буду благодарен за развернутое объяснение с примерами, особенно про разницу между ?. и !! в контексте цепочек вызовов. Заранее спасибо!