Android Crashlytics非空变量触发空指针异常,AS提示矛盾问题咨询
问题原因分析
你的情况核心矛盾在于代码声明的类型约束和实际运行时的数据不一致:
- Android Studio提示
it.list != null总是true,说明it.list在数据模型里被标记为非空类型(比如Kotlin里的List<T>而非List<T>?,或是Java中加了@NonNull注解),IDE基于这个类型推断认为空校验是多余的。 - 但Crashlytics的空指针崩溃实锤了
it.list在运行时是null——这大概率是后端接口违反了约定,返回了null而非空集合;或是JSON解析库(如Gson、Moshi)在解析时,把null值强行赋值给了被标记为非空的字段。 - 当你调用
mutablelist.addAll(it.list)时,addAll方法内部会调用Collection.toArray(),一旦it.list实际为null,就会触发空指针异常。
修复方案
- 修正数据模型的可空性:把
it.list的类型改为可空(Kotlin用List<T>?,Java去掉@NonNull注解),这样IDE就不会拦截你的非空校验,你可以安全地写:
或者用Kotlin的安全调用简化:if (it.list != null) { mutablelist.addAll(it.list) }it.list?.let { list -> mutablelist.addAll(list) } - 解析时兜底为空集合:配置JSON解析库,当遇到null的集合字段时,自动替换为空集合而非null。比如用Gson可以自定义TypeAdapter,用Moshi可以加
@Json(defaultValue = "[]")注解(需对应版本支持),确保解析后不会出现null。 - 调用时强制兜底:即使暂时不改模型,也可以用Elvis运算符给一个空集合兜底,避免空指针:
mutablelist.addAll(it.list ?: emptyList()) - 后端源头修复:如果是后端接口返回null的问题,协调后端开发将空集合场景返回
[]而非null,从根源避免数据不一致问题。
内容的提问来源于stack exchange,提问作者Federico Bortolozzo
相关产品推荐
相关产品推荐

