Как взаимодействуют свойства lateinit и nullable при вызове их методов

Первое обращение к неинициализированному lateinit завершится UninitializedPropertyAccessException. До безопасного вызова через second?.get() выполнение не дойдёт.

Короткий ответ

Что ответить на собеседовании

Первое обращение к неинициализированному lateinit завершится UninitializedPropertyAccessException. До безопасного вызова через second?.get() выполнение не дойдёт.

Подробный разбор

Ответ с пояснениями

Условие

Опишите, как будет работать код, в котором применяются свойства с модификатором lateinit и nullable‑свойства, при попытке вызвать у них методы. Укажите, что произойдёт во время выполнения, какие исключения могут быть выброшены или какие вызовы будут безопасными.

class A {
    lateinit var first: Model
    var second: Model? = null
}

fun main() {
    val a = A()
    a.first.get()
    a.second?.get()
}

Ответ

Первое обращение к неинициализированному lateinit завершится UninitializedPropertyAccessException. До безопасного вызова через second?.get() выполнение не дойдёт.

lateinit откладывает присваивание ненулевого свойства, но не делает чтение до присваивания безопасным. Ошибка возникает уже при получении a.first, прежде чем будет вызван get().

Если отдельно выполнить a.second?.get(), при second == null вызов будет пропущен. Для первого свойства нужно сначала присвоить экземпляр Model либо явно проверять инициализацию внутри доступного для этого контекста. Тип Model и его метод здесь предполагаются объявленными в проекте.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее