不确定是什么原因造成的,但是我正在尝试从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)
和
class MainPresenter(private val view:MainView, private val apiRepository: ApiRepository, private val gson: Gson){
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)
答案 0 :(得分:0)
Parameter specified as non-null is null
。这意味着data.result
返回为null。原因可能有多种,最常见的原因是我从api调用返回的json与您在MovieResponse::class.java
中所说的对象不同。
无论如何,当您告诉编译器传递给该函数的参数永远不会为空,而实际上为java.lang.IllegalArgumentException: Parameter specified as non-null is null
null
。
答案 1 :(得分:0)
我在这里有点猜测,但是我认为以下是正确的:
MovieResponse
是用Java定义的showMovieList()
是在Kotlin中定义的,并且仅接受非null值来自Java的值在Kotlin中被特殊对待:允许您将它们当作非空值使用,但允许null
值。这是一种语言功能,旨在使您的生活变得更好,因为另一种选择是将来自Java的每个值视为可为空。
您可以在此处了解更多信息:https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types
这对您来说意味着您没有编译时的null安全性,而必须自己解决问题。显然,data.result
有时为null,因此您需要确保处理这种情况。
替换这些行:
uiThread { view.showMovieList(data.result) }
带有这些:
data.result?.let {
uiThread {
view.showMovieList(it)
}
}