Kotlin-IllegalArgumentException

Kotlin-IllegalArgumentException,kotlin,android-asynctask,gson,Kotlin,Android Asynctask,Gson,不确定是什么原因导致了这种情况,但我正在尝试从api请求数据,并且得到了一个IllegalArgumentException package com.example.tmdb import com.google.gson.Gson import org.jetbrains.anko.doAsync import org.jetbrains.anko.uiThread class MainPresenter(private val view:MainView, private val apiR

不确定是什么原因导致了这种情况,但我正在尝试从api请求数据,并且得到了一个IllegalArgumentException

package com.example.tmdb

import com.google.gson.Gson
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread

class MainPresenter(private val view:MainView, private val apiRepository: ApiRepository, private val gson: Gson){
    fun getMovieList(){
        doAsync {
            val data = gson.fromJson(apiRepository.doRequest(TMDBApi.getMovie()),
                MovieResponse::class.java)

            uiThread {
                view.showMovieList(data.result)
            }
        }
    }
}
我得到异常的行是

view.showMovieList(data.result)

Logcat中显示的错误消息为:-

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter data
        at com.example.tmdb.MainActivity.showMovieList(MainActivity.kt)
        at com.example.tmdb.MainPresenter$getMovieList$1$1.invoke(MainPresenter.kt:14)
        at com.example.tmdb.MainPresenter$getMovieList$1$1.invoke(MainPresenter.kt:7)
        at org.jetbrains.anko.AsyncKt$uiThread$1.run(Async.kt:71)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

指定为非null的参数为null
。这意味着
data.result
返回为null。这可能有多种原因,我能想到的最常见的原因是,从api调用返回的json与您在
MovieResponse::class.java
中所说的对象不同


不管怎样,当您告诉编译器传递给此函数的参数永远不会为null,而是事实上为null时,就会出现错误
java.lang.IllegalArgumentException:指定为非null的参数为null
,我在这里做了一些猜测,但我假设以下是真的:

  • MovieResponse
    是用Java定义的
  • showMovieList()
    在Kotlin中定义,只接受非空值
来自Java的值在Kotlin中被特别处理:您可以像处理非空值一样处理它们,但是
null
值是允许的。这是一个旨在让您的生活更美好的语言特性,因为另一种选择是将来自Java的每个值都视为可空

您可以在此处阅读更多关于此的信息:

这对您来说意味着您没有编译时空安全性,必须自己解决问题。显然,
data.result
有时是空的,所以您需要确保处理这个场景

更换这些线路:

有了这些:

data.result?.let {
    uiThread {
        view.showMovieList(it)
    }
}
uiThread {
    view.showMovieList(data.result)
}
data.result?.let {
    uiThread {
        view.showMovieList(it)
    }
}