Ответ вслух Junior Null-safety спрашивают часто обновлено

Как Kotlin защищает от NPE

Вопрос

Как Kotlin защищает от NullPointerException и когда NPE всё равно возможен?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

В Kotlin возможность null является частью типа: String никогда не null, а String? может быть. Обратиться к методу nullable-значения напрямую нельзя, компилятор потребует проверку.

Что должно прозвучать в ответе

  • Nullable и non-null типы: `String` и `String?` разные

  • Компилятор требует проверку перед обращением к nullable

  • Операторы `?.`, `?:`, `let` и smart cast после проверки

  • NPE возможен при `!!` и с платформенными типами из Java

  • Ещё случаи: вызов открытого метода из конструктора, lateinit до инициализации даёт своё исключение

Что могут спросить следом

  • Что такое платформенный тип?
  • Почему не работает smart cast для var-свойства?
  • Где в Android-коде чаще всего появляется !!?

Разбор

В Kotlin возможность null является частью типа: String никогда не null, а String? может быть. Обратиться к методу nullable-значения напрямую нельзя, компилятор потребует проверку. Инструменты: безопасный вызов ?., Elvis ?: со значением по умолчанию или ранним return, let для блока только с не-null значением и smart cast после явной проверки. NPE остаётся возможен в нескольких местах. Первое: оператор !!, это явный отказ от защиты. Второе: платформенные типы из Java без аннотаций, Kotlin не знает про null и доверяет разработчику. Третье: вызов открытого метода из конструктора базового класса, когда поля наследника ещё не инициализированы. Обращение к lateinit до присваивания тоже падает, но с UninitializedPropertyAccessException.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.