为什么我的 LocalDate.parse 不能使用从 gson 插入的值?

why wont my LocalDate.parse work with a value inserted from gson?

我有一个 class:

data class Day(val date: String, val events: List<Event>){
    val localDateTimeDate: LocalDate by lazy {
        LocalDate.parse(date)
    }
}

这是从 JSON 字符串(例如 {"date": "2019-06-26", "events": []}.

如果我阅读 someDay.date,我会得到“2019-06-26”,所以填充部分有效。 如果我读取 someDay.localDateTimeDate,我会得到一个空指针异常,但我不明白为什么。

现在,如果我进入 REPL 并手动填充一个 "Day"(即 val day = Day("2019-06-26"", emptyList()),这会起作用。 如果我让 android phone 做 LocalDate.parse("2019-06-26"),那就行得通了。

一天的时间是:

    fun receiveDays(): List<Day> {
        val listType = object : TypeToken<List<Day>>() { }.type
        val jsonData = (client.readFromSocket()!!.message).toString(Charsets.UTF_8)
        val daysList =(Gson().fromJson<List<Day>>(jsonData, listType))
        client.sendOK()
        return daysList

如果我尝试读取 someDay.localDateTimeDate,我会得到一个空指针异常:

2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object kotlin.Lazy.getValue()' on a null object reference
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at nl.joozd.joozdter.data.Day.getLocalDateTimeDate(Unknown Source:25)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at nl.joozd.joozdter.ui.PdfParserActivity$onCreate$$inlined$let$lambda.invoke(PdfParserActivity.kt:140)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at nl.joozd.joozdter.ui.PdfParserActivity$onCreate$$inlined$let$lambda.invoke(PdfParserActivity.kt:28)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at org.jetbrains.anko.AsyncKt$doAsync.invoke(Async.kt:143)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at org.jetbrains.anko.AsyncKt$doAsync.invoke(Unknown Source:0)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at org.jetbrains.anko.AsyncKt$sam$java_util_concurrent_Callable[=13=].call(Unknown Source:2)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2019-08-13 00:06:13.075 21870-21942/nl.joozd.joozdter W/System.err:     at java.lang.Thread.run(Thread.java:764)

如果 class 没有无参数构造函数,Gson 会在不调用构造函数的情况下创建一个对象,因此存储 lazy 委托的字段不会被初始化,并且当访问委托给它的 属性。

另请参阅此问题以了解可能的解决方案: