Kotlin-IllegalArgumentException

时间:2019-07-22 21:31:59

标签: 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 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)

2 个答案:

答案 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)
    }
}