Kotlin-IllegalArgumentException
不确定是什么原因导致了这种情况,但我正在尝试从api请求数据,并且得到了一个IllegalArgumentExceptionKotlin-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
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
,我在这里做了一些猜测,但我假设以下是真的:
是用Java定义的MovieResponse
在Kotlin中定义,只接受非空值showMovieList()
null
值是允许的。这是一个旨在让您的生活更美好的语言特性,因为另一种选择是将来自Java的每个值都视为可空
您可以在此处阅读更多关于此的信息:
这对您来说意味着您没有编译时空安全性,必须自己解决问题。显然,data.result
有时是空的,所以您需要确保处理这个场景
更换这些线路:
有了这些:
data.result?.let {
uiThread {
view.showMovieList(it)
}
}
uiThread {
view.showMovieList(data.result)
}
data.result?.let {
uiThread {
view.showMovieList(it)
}
}