【发布时间】:2019-08-22 03:08:40
【问题描述】:
问题
Foo数据类可以转换各种类型。
为了高效实现,属性使用lazy delegate实现。但是当我尝试访问惰性属性时,我遇到了 NPE。当我使用转换函数toBar时,不会发生NPE。
//data from Retrofit response via GsonConverter
data class Foo(
@SerializedName("type") val type: String,
@SerializedName("data") val data: JsonElement
) {
val asBar by lazy { // it's throw NPE
Bar.fromJson(data)
}
val asVar by lazy {
Var.fromJson(data)
}
fun toBar() = Bar.fromJson(data)
fun toVar() = Var.fromJson(data)
}
在 RecyclerViewAdapter 中的使用(扩展 PagedListAdapter)
...
override fun onBindViewHolder(
holder: RecyclerView.ViewHolder,
position: Int
) {
when (holder) {
is BarHolder -> getItem(position)?.asBar?.let(holder::bind) // NPE
is VarHolder -> getItem(position)?.asVar?.let(holder::bind) // NPE
//is BarHolder -> getItem(position)?.toBar()?.let(holder::bind) // it's work
//is VarHolder -> getItem(position)?.toVar()?.let(holder::bind) // it's work
}
}
异常
java.lang.NullPointerException:尝试在空对象引用上调用接口方法“java.lang.Object kotlin.Lazy.getValue()”
为什么会发生 NPE?如何解决?
【问题讨论】:
-
请分享更多细节。 getItem() 有什么作用?是否涉及任何序列化?如果 Foo 类是由某个 Json 反序列化库实例化的,而不是由调用构造函数的代码实例化的,那么这可能会解释问题。想想这个类在 Java 中的样子。
-
@MateuszStefek 感谢您的回复。我附上了更多详细信息。