You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中可空Serializable类被识别为非空类致Activity Result崩溃

解决Serializable类在Activity Result中强制转换导致的空指针异常

问题原因

错误日志明确指出null被强制转换为非空类型UserDat,核心问题在于:

  • getSerializableExtra("userdata")的返回值是Serializable?(可空类型),但你使用了as UserDat这种非空强制转换,当返回值为null时直接触发空指针。
  • 混淆了「类的属性可空」和「对象实例本身可空」:UserDat类的属性允许为null,但getSerializableExtra可能因Extra未正确传递、序列化失败等原因返回null,此时强制非空转换必然崩溃。

解决方案

使用**安全转换运算符as?**替代强制转换,同时配合空安全处理逻辑避免null值崩溃。另外,由于UserDat的属性本身也是可空的,需要对属性访问做空安全处理。

修改后的代码示例

发起请求的Activity(Profile.kt)

var userData = UserDat()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ... // 初始化视图绑定

    val editLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
            // 安全转换,转换失败或对象为null时返回null
            (result.data?.getSerializableExtra("userdata") as? UserDat)?.let { receivedData ->
                userData = receivedData
                binding.apply {
                    // 对可空属性做空安全处理,避免toString()时崩溃
                    tvUserAge.text = receivedData.age?.toString() ?: "未设置"
                    tvUserHeight.text = receivedData.height?.toString() ?: "未设置"
                    tvUserWeight.text = receivedData.weight?.toString() ?: "未设置"
                }
            }
        }
    }

    binding.btEditData.setOnClickListener {
        editLauncher.launch(Intent(this@Profile, MeasurmentsEditor::class.java))
    }
}

额外优化建议

  1. 优先使用Parcelable替代Serializable:Parcelable是Android官方推荐的序列化方式,性能远高于Serializable,且类型检查更严格,能减少这类空转换问题。
  2. 定义常量存储Extra键名:避免硬编码字符串导致的拼写错误,比如:
    companion object {
        const val EXTRA_USER_DATA = "userdata"
    }
    
    调用时直接使用EXTRA_USER_DATA,降低出错概率。

内容的提问来源于stack exchange,提问作者W1ggex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:55:24