Как Kotlin защищает от NPE
Вопрос
Как Kotlin защищает от NullPointerException и когда NPE всё равно возможен?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.