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)
发布于 2017-02-07 06:47:21
这个问题是由丢失有序的init块和属性初始化器引起的。如answer about class initialization semantics所述。init块不是构造函数-它的代码包含在主构造函数中。
以下示例:
class OrderOfInits {
constructor() {
println("constructor")
}
init {
println("A")
}
init {
println("B")
}
init {
println("C")
}
}
val a = OrderOfInits()将印刷:
A
B
C
constructor属性委托初始化也是主构造函数的一部分。它们在构造函数中的初始化顺序反映了它们被声明的顺序。换句话说,init { fill(...) }初始化程序块调用clientUrl设置器,后者又试图调用Delegates.notNull()实例方法。然而,保存Delegates.notNull()的实例字段尚未被设置,因此NPE。
要解决这个问题,只需按如下方式重新排序:
object WalletConfig {
var clientUrl: String by Delegates.notNull()
private set
init {
fill(HashMap<String, String>())
}
...
}https://stackoverflow.com/questions/42082613
复制相似问题