首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象构造函数与Delegates.notNull

对象构造函数与Delegates.notNull
EN

Stack Overflow用户
提问于 2017-02-07 05:47:27
回答 1查看 790关注 0票数 2
代码语言:javascript
复制
object WalletConfig {

    init {
        fill(HashMap<String, String>())
    }

    var clientUrl: String by Delegates.notNull()
        private set

    fun fill(settingMap: Map<String, String>) {
        try {
            clientUrl = settingMap["URL_CLIENT"] ?: ""
        } catch(ex:Exception) { }
    }
}

抛出示例: fill: Load 'wallet.config‘配置文件: java.lang.NullPointerException at ru.WalletConfig.setClientUrl(WalletConfig.kt)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-07 06:47:21

这个问题是由丢失有序的init块和属性初始化器引起的。如answer about class initialization semantics所述。init块不是构造函数-它的代码包含在主构造函数中。

以下示例:

代码语言:javascript
复制
class OrderOfInits {
    constructor() {
        println("constructor")
    }
    init {
        println("A")
    }
    init {
        println("B")
    }
    init {
        println("C")
    }
}

val a = OrderOfInits()

将印刷:

代码语言:javascript
复制
A
B
C
constructor

属性委托初始化也是主构造函数的一部分。它们在构造函数中的初始化顺序反映了它们被声明的顺序。换句话说,init { fill(...) }初始化程序块调用clientUrl设置器,后者又试图调用Delegates.notNull()实例方法。然而,保存Delegates.notNull()的实例字段尚未被设置,因此NPE。

要解决这个问题,只需按如下方式重新排序:

代码语言:javascript
复制
object WalletConfig {
    var clientUrl: String by Delegates.notNull()
        private set

    init {
        fill(HashMap<String, String>())
    }
    ...
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42082613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档