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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:40:49