Почему происходит ошибка при обращении к неинициализированной переменной в Kotlin и где это происходит
Что проверяют
Различаете ли вы ошибку компиляции и ошибку рантайма, и понимаете ли, чем платите за lateinit. За вопросом обычно стоит история про падение приложения на пустом экране.
Как отвечать
Случаев два, и разделить их надо сразу.
Локальная переменная: компилятор разбирает пути исполнения и, если до чтения присваивания могло не быть, выдаёт ошибку компиляции про то, что переменная должна быть инициализирована. Объявить val x: Int без значения и присвоить ниже ровно один раз законно, запрещено именно читать до присваивания. До рантайма дело не доходит.
Свойство класса: должно получить значение в объявлении, в конструкторе или в блоке init. Отложить можно тремя способами: сделать тип nullable, взять by lazy, объявить lateinit var. У lateinit проверка уезжает в рантайм: чтение до присваивания даёт UninitializedPropertyAccessException. Работает он только с var, не с примитивами и не с nullable-типами, а состояние можно проверить через ::field.isInitialized.
В Android это почти всегда про lateinit var binding или адаптер: значение кладут в onCreate или onViewCreated, а обращение прилетает раньше, либо во фрагменте уже после onDestroyView, когда ссылку обнулили.
Отдельно стоит упомянуть порядок инициализации: свойство, прочитанное из блока init или из open-метода, вызванного конструктором, до своего объявления видно как null.
Где спотыкаются
Отвечают, что будет NullPointerException. Для локальной переменной это ошибка компиляции, для lateinit это UninitializedPropertyAccessException, и путаница выдаёт, что человек не читал реальный стектрейс.
Вешают lateinit на всё подряд, лишь бы убрать вопросительный знак из типа. Это обмен проверки компилятора на падение у пользователя, и оправдан он только там, где значение действительно приходит из жизненного цикла.
Держат во фрагменте lateinit var binding на всё время жизни объекта и не обнуляют в onDestroyView. View уже уничтожена, ссылка жива, получается и утечка памяти, и падение при повторном показе фрагмента.