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

Kotlin遍历JsonArray报UnsupportedOperationException:JsonNull异常排查

报错原因

你遇到的Fatal Exception: java.lang.UnsupportedOperationException: JsonNull是Gson解析时的典型异常,触发原因是代码中对Json元素做类型强转、取值时,没有做JsonNull类型校验,具体问题点如下:

  • 遍历数组时直接调用jsonArray.get(i).getAsJsonObject(),如果数组第i位的元素是JsonNull类型,强转JsonObject会直接抛出异常
  • 代码中多处使用!!非空断言强转对象,一旦前置取值结果为null,会直接触发空指针
  • 从JsonObject中取三个业务字段时,直接调用getAsString(),只要任意一个字段不存在、或字段值为JsonNull,就会触发你遇到的这个UnsupportedOperationException
修复方案

替换为以下带空安全、类型校验的解析逻辑即可:

for (i in 0 until (jsonArray?.size() ?: 0)) {
    // 校验当前数组元素为合法JsonObject,不合法则跳过当前项
    val stringCode = jsonArray?.get(i)?.takeIf { it.isJsonObject }?.asJsonObject ?: continue
    // 逐字段取值,遇到JsonNull、类型不匹配时赋值默认空串,避免异常
    val airwayBillNo = stringCode.get(TagName.AIRWAYBILLNO)?.takeIf { it.isJsonPrimitive }?.asString ?: ""
    val status = stringCode.get(NotificationCompat.CATEGORY_STATUS)?.takeIf { it.isJsonPrimitive }?.asString ?: ""
    val syncValue = stringCode.get(DatabaseHandler.Companion.KEY_SYNC)?.takeIf { it.isJsonPrimitive }?.asString ?: ""

    singleUpdateArrayList?.add(
        SingleUpdateResp(airwayBillNo, status, syncValue)
    )
}

修复逻辑说明:

  • 移除所有不安全的!!非空断言,改用Kotlin安全调用?.配合空值默认值,从根源避免空指针
  • 数组长度取值加空安全,如果jsonArray本身为null,直接不进入循环,不会触发崩溃
  • 数组元素先做类型校验,非JsonObject类型的元素直接跳过,不中断整个遍历流程
  • 每个字段取值前先校验是否为字符串基本类型,排除JsonNull、嵌套对象、数组等非法类型,取不到值时用空字符串作为默认值,彻底解决JsonNull导致的异常

内容的提问来源于stack exchange,提问作者Raj Kumar Barayee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:09:23