API调用正常,但ViewModel指定非空参数返回Null,求排查
问题:API调用成功但非空参数返回Null触发空指针异常
调用ViewModel时,API调用成功,但SPManager的saveTitleID方法因传入的title参数为Null触发空指针异常,怀疑问题出在ViewModel中。
相关代码
ViewModel代码
class HomeFragmentVM( private val spManager: SPManager, private val repository: Repository ) : AbstractViewModel() { private val washingMachine = MutableLiveData<Post>() fun getWashingMachines() { launch { repository.getPost() .doOnSubscribe { } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ washingMachine.value = it spManager.saveTitleID(it.title) }, { }) } } }
Post模型代码
data class Post( @SerializedName("products") var data: List<Data>, @SerializedName("productId") var productid: Int, @SerializedName("title") var title: String )
调试日志
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter title at com.invenium.jlp_android_test.utils.SPManager.saveTitleID(Unknown Source:2) at com.invenium.jlp_android_test.functionalities.Home.HomeFragmentVM$getWashingMachines$1.invoke$lambda-1(HomeFragmentVM.kt:32) at com.invenium.jlp_android_test.functionalities.Home.HomeFragmentVM$getWashingMachines$1.lambda$UfyFFA37mNg1-E8x0CGZ3EyBoEY(Unknown Source:0) at com.invenium.jlp_android_test.functionalities.Home.-$$Lambda$HomeFragmentVM$getWashingMachines$1$UfyFFA37mNg1-E8x0CGZ3EyBoEY.accept(Unknown Source:4) at io.reactivex.internal.observers.ConsumerSingleObserver.onSuccess(ConsumerSingleObserver.java:63) at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:81) at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:119) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
原因分析
- API返回数据与模型不匹配:Post模型中
title被声明为非空String,但实际API返回的title字段为Null,解析库(如Gson)会将Null赋值给非空字段,导致运行时触发Kotlin非空检查异常。 - ViewModel未做空值校验:在
subscribe成功回调中直接使用it.title,未先判断其是否为Null就传入要求非空参数的saveTitleID方法,最终引发空指针。
解决方案
方案1:调整模型类,允许title为空
将Post模型中的title改为可空类型,从根源避免解析时的隐性赋值问题:
data class Post( @SerializedName("products") var data: List<Data>, @SerializedName("productId") var productid: Int, @SerializedName("title") var title: String? // 改为可空类型 )
方案2:在ViewModel中增加空值校验
调用saveTitleID前先检查title是否为Null,避免传入非法参数:
.subscribe({ washingMachine.value = it it.title?.let { validTitle -> spManager.saveTitleID(validTitle) } ?: run { // 处理title为空的场景,比如打印日志或进行友好提示 } }, { // 补充API调用失败的处理逻辑 })
方案3:规范API返回数据
与后端开发人员沟通,确保API返回的title字段始终不为空,匹配模型类的非空声明。
内容的提问来源于stack exchange,提问作者Inveniuum
相关产品推荐
相关产品推荐

