(Kotlin) свойство lateinit 'VAL variable' не инициализировано

У кого-то есть аналогичная проблема раньше?

Как мы можем объявить значение переменной по умолчанию для init ()?

Ниже приведен пример моего кода,

@Value("\${app.email-config-file: D:\\email\\src\\main\\resources\\email.config}") private lateinit var emailDir: String init { log.info("====================================================================================================") log.info("Email Config File Dir: ${this.emailDir}") log.info("====================================================================================================") } 

Затем ниже исключения throw:

Причина: kotlin.UninitializedPropertyAccessException: свойство lateinit emailDir не был инициализирован

Любое решение может делиться?

Как мы можем объявить значение переменной по умолчанию для init ()?

После того, как у вас есть значение по умолчанию, свойство не должно быть помечено как lateinit . Таким образом, вы просто выполните:

 @Value("\${app.email-config-file: D:\\email\\src\\main\\resources\\email.config}") private var emailDir: String = "someDirectory/" init { log.info("=============================================================") log.info("Email Config File Dir: ${this.emailDir}") log.info("=============================================================") } 

lateinit var Kotlin lateinit var не могут быть доступны до того, как значение действительно будет установлено, и в этом случае будет lateinit var .

Из того, что я вижу в вашем коде, вы ожидаете, что значение свойства будет установлено каркасом (Spring?) На основе аннотации @Value . Но вы получаете доступ к свойству в блоке init , который выполняется во время построения объекта , и я уверен, что инфраструктура устанавливает значения только после создания объекта.

Вы можете либо не использовать значение свойства до его установки (не использовать его в блоках init и других инициализаторах свойств), либо предоставить значение по умолчанию для свойства, как в ответе @ wasyl.

Я предполагаю, что вы используете весну и его ДИ.

Проблема заключается в том, что вы вызываете поле электронной почты перед тем, как сделать экземпляр, и не можете вводить зависимости, если у вас нет экземпляра. Чтобы исправить эту проблему, установите зависимость в конструкторе.

 @Component class Foo @Inject constructor(@param:Value("\${some.property}") val emailDir: String) { init { log.info("=============================================================") log.info("Email Config File Dir: ${this.emailDir}") log.info("=============================================================") } } 
Intereting Posts
Статические функции Котлина: объект-компаньон, @JvmStatic @JvmField Не удалось разрешить хост pokeAPI Общий параметр Котлина с использованием функции jackson-dataformat-csv не игнорирует неизвестные свойства Ошибка при смене лямбды для плоской карты из двух наблюдений на плоскую карту двух синглов ojAlgo Линейная оптимизация – предотвращение дублирования рабочей смены? Гессон Deserialization с Kotlin, блок инициализатора не называется Есть ли менее уродливый способ вернуть функцию в Котлин? Как сохранить логотип над рушащейся панелью инструментов Как установить свойство объекта-компаньона в Котлин через отражение? Как заменить webView пользовательским webView? Недопустимая строка JSON для ответа в android-apollo У Котлина есть сборщик мусора? Если да, то на каком алгоритме он основан? Почему запуск тестов kotlin настолько медленный в AndroidStudio 3.0 Kotlin: преобразовать массив в Java varargs