(Kotlin)lateinit property&#VAL; VAL变量'尚未初始化

时间:2017-05-30 02:54:52

标签: kotlin

之前有没有类似的问题?

我们如何声明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尚未初始化

任何解决方案都可以分享?

3 个答案:

答案 0 :(得分:3)

在实际设置值之前无法访问Kotlin lateinit var properties,并且在这种情况下会抛出UninitializedPropertyAccessException

从我在代码中看到的内容,您希望基于@Value注释的框架(Spring?)设置属性值。但是你可以访问init block, which is executed at the object construction time中的属性,我很确定,框架只在构造对象后才设置值。

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

答案 1 :(得分:2)

  

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

答案 2 :(得分:0)

我假设你使用了春天和他的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("=============================================================")
     }
}