gpt4 book ai didi

android - 尝试在空对象引用上调用接口(interface)方法 'java.lang.Object kotlin.Lazy.getValue()'

转载 作者:行者123 更新时间:2023-12-02 11:51:49 25 4
gpt4 key购买 nike

对不起我的愚蠢问题。

我有谷歌这个问题,但答案对我不起作用。

这是我的代码。

  data class Article(val id: Long, val title: String, val ingress: String, val image: String,
val dateTime: String, val tags: List<String>, val content: List<Item>, val created: Long, val changed: Long) {

@delegate:Transient
val formatDateString: String by lazy {
val sdf = SimpleDateFormat("dd.MM.yyyy HH.mm")
val date: Date = sdf.parse(dateTime)
var time: String?
if (date.year == Date().year) {
time = SimpleDateFormat("dd MM,HH:mm", Locale.US).format(date)
} else {
time = SimpleDateFormat("dd MM yyyy,HH:mm", Locale.US).format(date)
}
time!!
}

}

当我尝试获取 formatDateString value ,会发生上述异常。

代码访问 formatDateString如下
  override fun getCustomAdapter(): BaseQuickAdapter<CarListResponseBody.Article, BaseViewHolder> {
return object : BaseQuickAdapter<CarListResponseBody.Article, BaseViewHolder>( R.layout.app_item_cars_list,dataList) {
override fun convert(helper: BaseViewHolder, item: CarListResponseBody.Article) {
helper.setText(R.id.tv_ingress,item.ingress)
helper.setText(R.id.tv_date_time,item.formatDateString)
helper.setText(R.id.tv_title,item.title)
ImageLoadUtil.loadImgToView(context,item.image,helper.getView(R.id.img_car),null)
}
}
}

我认为这个异常是由 Gson 引起的,但我不知道为什么

最佳答案

我不是专业人士,但我想告诉你我发现了什么。让我们创建一个简单的类来看看 Kotlin 中的委托(delegate)是如何工作的。以防万一,我正在使用 Kotlin 1.3.70 .这是我们的简单类:

class Test {
val test by lazy { "test" }
}

在 Idea 或 Android Studio 中,您可以检查字节码。但至少对我来说,阅读 JVM 字节码非常困难 :) 让我们将其转换为类似于 Java 的内容:

...
public final class Test {
@NotNull
private final Lazy test$delegate;

@NotNull
public final String getTest() {
Lazy var1 = this.test$delegate;
Object var3 = null;
boolean var4 = false;
return (String)var1.getValue();
}

public Test() {
this.test$delegate = LazyKt.lazy((Function0)null.INSTANCE);
}
}
...

如您所见,Kotlin 为 lazy 创建了一个特殊字段。在构造函数中初始化的委托(delegate)。问题是 Gson 使用 UnsafeAllocator并且不调用构造函数。您可以阅读更多关于它的信息,例如 here .所以当你反序列化你的 Article它包含的对象 null而不是适当的 lazy代表。这就是为什么在尝试调用此 del 时出现空指针异常的原因

关于android - 尝试在空对象引用上调用接口(interface)方法 'java.lang.Object kotlin.Lazy.getValue()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55991838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com