(Kotlin)lateinit属性“VAL变量”尚未初始化

任何一个有类似的问题?

我们如何声明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("====================================================================================================") } 

然后下面的异常抛出:

引起: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("=============================================================") } 

在实际设置值之前,不能访问Kotlin lateinit var属性 ,在这种情况下会引发lateinit var

从我在代码中看到的,你期望的属性值是由基于@Value注解的框架(Spring?)设置的。 但是你可以访问init块中的属性,这个属性是在构造对象的时候执行的 ,我很肯定,框架只有在构造对象后才会设置值。

您可以避免在设置属性值之前使用属性值(不要在init块和其他属性初始值设定项中使用它),或者为属性提供默认值,如@ wasyl的回答。

我假设你使用春天和他的DI。

问题是您在创建实例之前调用了电子邮件字段,如果没有任何实例,则无法注入相关性。 为了解决这个问题,在构造函数中设置依赖关系。

 @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("=============================================================") } }