android - 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 背后的原因是什么?
解决方案
我遇到了这个问题,发现我的数据类上的一个不可为空的属性在 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 具有导致异常的空值。