使用@Parcelize创建Model类时,Image为null引发Parcelable空指针错误求助
哈哈,这个坑我踩过!你遇到的问题是因为@Parcelize默认不会自动处理可空的Parcelable类型字段——当服务器返回的Image为null时,Parcelize生成的序列化代码会直接尝试调用null对象的writeToParcel方法,自然就抛出空指针了。
给你几个靠谱的解决办法,按优先级来:
1. 给可空Parcelable字段添加@Nullable注解
这是最简单的方式,明确告诉Parcelize这个字段可以为null,它就会生成能处理null的代码:
import android.os.Parcelable import kotlinx.parcelize.Parcelize import androidx.annotation.Nullable @Parcelize data class YourResponseModel( val userId: String, @Nullable val image: Image? // 标记可空并添加注解 ) : Parcelable // 确保你的Image类也是用@Parcelize实现的Parcelable @Parcelize data class Image( val url: String, val height: Int, val width: Int ) : Parcelable
2. 给可空字段设置默认值
如果你的业务逻辑允许Image字段默认是null,直接给它加个默认值也能解决问题:
@Parcelize data class YourResponseModel( val userId: String, val image: Image? = null // 默认值设为null ) : Parcelable
3. 手动实现Parcelable(备选方案)
如果前两种方法都不适用,你可以放弃@Parcelize,手动实现Parcelable接口,自己控制null的处理逻辑:
import android.os.Parcel import android.os.Parcelable data class YourResponseModel( val userId: String, val image: Image? ) : Parcelable { // 从Parcel反序列化 constructor(parcel: Parcel) : this( parcel.readString() ?: "", parcel.readParcelable(Image::class.java.classLoader) // readParcelable会处理null ) override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(userId) parcel.writeParcelable(image, flags) // writeParcelable支持传入null } override fun describeContents(): Int = 0 companion object CREATOR : Parcelable.Creator<YourResponseModel> { override fun createFromParcel(parcel: Parcel): YourResponseModel { return YourResponseModel(parcel) } override fun newArray(size: Int): Array<YourResponseModel?> { return arrayOfNulls(size) } } } @Parcelize data class Image( val url: String, val height: Int, val width: Int ) : Parcelable
本质上,问题的核心就是@Parcelize在处理可空Parcelable类型时,需要明确的提示才能生成安全的代码——要么用注解标记,要么给默认值,这样它就不会傻乎乎地直接调用null对象的方法啦。
内容的提问来源于stack exchange,提问作者N Sharma
相关产品推荐
相关产品推荐

