首页 > 解决方案 > NPE 在 Kotlin 数据类中使用 @Parcelize 注释

问题描述

我最近将我的 Java Models 类迁移到 Kotlin Data 类。我正在使用 @Parcelize 注释来避免 Parcelable 的样板代码。我在 Kotlin 中的数据类如下所示,

@Parcelize
data class TimeLine(
    @SerializedName("submittedOnDate")
    var submittedOnDate: List<Int> = ArrayList(),

    @SerializedName("submittedByUsername")
    var submittedByUsername: String,

    @SerializedName("submittedByFirstname")
    var submittedByFirstname: String,

    @SerializedName("submittedByLastname")
    var submittedByLastname: String,

    @SerializedName("approvedOnDate")
    var approvedOnDate: List<Int> = ArrayList(),

    @SerializedName("approvedByUsername")
    var approvedByUsername: String,

    @SerializedName("approvedByFirstname")
    var approvedByFirstname: String,

    @SerializedName("approvedByLastname")
    var approvedByLastname: String,

    @SerializedName("activatedOnDate")
    var activatedOnDate: List<Int>,

    @SerializedName("activatedByUsername")
    var activatedByUsername: String,

    @SerializedName("activatedByFirstname")
    var activatedByFirstname: String,

    @SerializedName("activatedByLastname")
    var activatedByLastname: String,

    @SerializedName("closedOnDate")
    var closedOnDate: List<Int>) : Parcelable`

但它给了我空指针错误,如下所示,

java.lang.NullPointerException: Attempt to invoke interface method 'int 
java.util.Collection.size()' on a null object reference at 
org.demo.mobile.models.accounts.savings.TimeLine.writeToParcel(TimeLine.kt:0) 
at  org.demo.mobile.models.accounts.savings.SavingAccount.writeToParcel(SavingAccount.kt:0)

我不知道为什么它显示 NullPointerException 因为 Java 模型工作正常。我该如何解决它以及 NPE 背后的原因是什么?

标签: androidkotlinkotlin-android-extensionskotlin-extension

解决方案


我遇到了这个问题,发现我的数据类上的一个不可为空的属性在 json 上接收到一个空值。

我的数据类:

@Parcelize
data class Person(
    @SerializedName("first_name") val firstName: String,
    @SerializedName("middle_name") val middleName: String,
    @SerializedName("last_name") val lastName: String,
    @SerializedName("birth_date") val birth: String,
    @SerializedName("education") val education: List<Education> // <-- non-nullable property
) : Parcelable {

    @Parcelize
    data class Education(
        @SerializedName("course") val course: String?,
        @SerializedName("school") val school: String?,
    ) : Parcelable

}

JSON:

[
  {
    "first_name": "Steve",
    "middle_name": "James",
    "last_name": "Roberson",
    "birth_date": "March 28, 1960",
    "education": [
      {
        "course": "Course 1",
        "school": "School 1",

      },
      {
        "course": "Course 2",
        "school": "School 2",

      }
    ]
  },
  {
    "first_name": "Michael",
    "middle_name": "Ong",
    "last_name": "Reyes",
    "birth_date": "March 28, 1960",
    "education": null // <-- this caused the error
  },

  ...
]

所以我通过添加将该属性声明为可为空的类型?,它解决了这个问题。

@SerializedName("education") val education: List<Education>?

在您的情况下,我相信您尝试解析的 JSON 具有导致异常的空值。


推荐阅读