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

Kotlin Fragment中SharedPreference存ArrayList遇空指针及JSON解析错误

解决SharedPreferences存取ArrayList的空指针与Json解析错误

问题根源分析

  1. 空指针错误:首次读取时SharedPreferences中无"data"键,getString("data", null)返回null,gson.fromJson解析null会返回null,此时调用carsList.isEmpty()直接触发空指针。
  2. Json语法错误:将默认值改为"{}"后,Gson尝试把对象格式的Json解析为ArrayList(数组类型),类型不匹配导致解析失败。

修复后的代码实现

读取数据方法(getData())

fun getData() {
    val sharedPreferences = activityCast().getSharedPreferences("DATA", Context.MODE_PRIVATE)
    val gson = Gson()
    // 使用空数组Json作为默认值,匹配ArrayList的数组类型
    val json = sharedPreferences.getString("data", "[]")
    val type: Type = object : TypeToken<ArrayList<Car>>(){}.type

    // 解析后得到空数组或已有数据的数组,兜底防止意外null
    carsList = gson.fromJson(json, type) ?: arrayListOf()
}

保存数据方法(saveBillData())

fun saveBillData(car: Car){
    val sharedPreferences = activityCast().getSharedPreferences("DATA", Context.MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    val gson = Gson()

    // 确保carsList不为null,避免未初始化就添加元素
    if (carsList == null) {
        carsList = arrayListOf()
    }
    carsList.add(car)

    val json: String = gson.toJson(carsList)
    editor.putString("data", json)
    // 修复apply的调用,必须加括号执行提交
    editor.apply()
}

关键注意事项

  • 读取时默认值必须用"[]"(空数组Json),保证与ArrayList的数组类型匹配,避免解析时的类型不匹配错误。
  • 保存数据前先检查并初始化carsList,防止未调用getData()就执行保存操作导致的空指针。
  • 注意editor.apply()必须加括号,否则不会执行SharedPreferences的修改提交,数据无法持久化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:40:34