Первое обращение к неинициализированному lateinit завершится UninitializedPropertyAccessException. До безопасного вызова через second?.get() выполнение не дойдёт.
Как взаимодействуют свойства lateinit и nullable при вызове их методов
Первое обращение к неинициализированному 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 и его метод здесь предполагаются объявленными в проекте.