【问题标题】:(Kotlin) lateinit property 'VAL variable' has not been initialized(Kotlin)lateinit 属性“VAL 变量”尚未初始化
【发布时间】:2017-05-30 02:54:51
【问题描述】:

以前有人遇到过类似的问题吗?

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

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

【问题讨论】:

  • 你在哪里设置 emailDir?你需要在init中设置它的值

标签: kotlin


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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("=============================================================")
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-04-14
        • 1970-01-01
        • 2022-11-22
        • 2021-10-13
        • 2022-07-05
        • 2017-03-03
        • 1970-01-01
        • 2020-12-31
        • 2021-06-11
        相关资源
        最近更新 更多