Kotlin Fragment中SharedPreference存ArrayList遇空指针及JSON解析错误
问题根源分析
- 空指针错误:首次读取时SharedPreferences中无"data"键,
getString("data", null)返回null,gson.fromJson解析null会返回null,此时调用carsList.isEmpty()直接触发空指针。 - 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
相关产品推荐
相关产品推荐

