IllegalArgumentException:指定为非空的参数为空

Posted

技术标签:

【中文标题】IllegalArgumentException:指定为非空的参数为空【英文标题】:IllegalArgumentException: Parameter specified as non-null is null 【发布时间】:2017-12-06 17:38:21 【问题描述】:

我收到以下运行时错误

 checkParameterIsNotNull, parameter oneClickTokens
    at com.info.app.fragments.Fragment_Payment_Profile$fetchMerchantHashes$1.onPostExecute(Fragment_Payment_Profile.kt:0)
    at com.info.app.fragments.Fragment_Payment_Profile$fetchMerchantHashes$1.onPostExecute(Fragment_Payment_Profile.kt:1543)

这是我的代码

 private fun fetchMerchantHashes(intent: Intent) 
    // now make the api call.
    val postParams = "merchant_key=$key&user_credentials=$var1"
    val baseActivityIntent = intent
    object : AsyncTask<Void, Void, HashMap<String, String>>() 

        override fun doInBackground(vararg params: Void): HashMap<String, String>? 
                ...
        

        override fun onPostExecute(oneClickTokens: HashMap<String, String>) 
            super.onPostExecute(oneClickTokens)
            ...

        
    .execute()

看来函数调用好像是无效的。但是,我不知道如何解决这个问题。有什么我错过的 Kotlin 特定的东西吗?

【问题讨论】:

没有问题。请制定一个以获得帮助。 【参考方案1】:

例外情况很明显:您为参数传递了null

默认情况下,Kotlin 中的所有变量和参数都是非空的。如果要将null 参数传递给方法,则应将? 添加到其类型中,例如:

fun fetchMerchantHashes(intent: Intent?)

欲了解更多信息:null-safety。

【讨论】:

【参考方案2】:

在我的例子中,这个错误警告 probable 将 null 作为参数传递。三种修正方式。

    在相应位置更改参数的类型。如果是从 Java 接收的,则在变量定义中添加 @NonNull 注释。 将!! 添加到方法的参数中。 在 Kotlin 类的参数中添加?。我认为,如果在 Java 类中没有使用注释(如@Nullable@NonNull),Kotlin 转换工具可能会默认执行此操作。

【讨论】:

错误不是警告,警告也不是错误。添加!!可能会导致 NullPointerException 仅仅因为您在运行时断言它实际上是 null 时是非 null 的。 @ezaspi,同意你的看法。我将添加一个? 案例。过去我设置!! 来查看运行时崩溃,这可能会发生NPE。 我们刚刚完成了对 Kotlin 的大型 android 重构和那些讨厌的事情!比以前存在的可能的空值更糟糕。例如,在 Android 中对方法 abc(String somevalue) 的调用被转换为 Kotlin(通过转换器)到 abc(somevalue: String!!)。在转换之前, abc 处理空值,但之后立即抛出 NPE。有人可能会争辩说我们应该有一个@Nullable,但它是一个大项目,所以没有抓住它们。并且只需要其中一个就可以使应用程序崩溃。 顺便说一句,如果它只是我们的代码,它不会那么糟糕。但是很多 Android 覆盖没有 @Nullable 注释。所以在自动转换器完成后,代码可能有这样的:override fun onItemSelected(parentView: AdapterView&lt;*&gt;, selectedItemView: View, position: Int, id: Long) 但它应该是一个可以为空的视图?因为这经常崩溃 @ezaspi,我完全同意你的观点,也多次遇到这些问题。这是自动转换器的缺点。抱歉,我在一年前开始学习 Kotlin 时写了这个答案。【参考方案3】:

简单的答案肯定会起作用... 当您使用 Rest 客户端(Web 服务调用)(GET 或 POST)从服务器获取数据时,如果 json 响应中可能存在空参数值,并且您正在获取参数并将其附加到 textview,您会得到这个错误..

解决方案: 只是追加?标记到变量如下..

示例:

var batchNo: String? = "" (Correct Approach)
var batchNo= "" (Will Get Error)

我正在尝试使用服务调用获取 batchNo。

【讨论】:

【参考方案4】:

在使用 Android Studio 转换工具将 Activity 从 Java 转换为 Kotlin 后,我发现了类似的异常。所以,我得到了override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent)

没错override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)

intent: Intent?的区别

【讨论】:

是的,它经常发生在不使用 @Nullable 注释的旧 Java 类中。 Kotlin 转换工具不知道,如何识别这个参数并猜测它不为空(那是一个错误)。在 Swift 中,如果你从 Objective-C 转换过来,它会猜测它可能是 nil。【参考方案5】:

对于每个绑定适配器,将项目参数的类型更改为可为空,并用

包裹主体

item?.let...

source 在谷歌文档中

【讨论】:

以上是关于IllegalArgumentException:指定为非空的参数为空的主要内容,如果未能解决你的问题,请参考以下文章

IllegalArgumentException:无效的列纬度

Retrofit-IllegalArgumentException:意外的 url

引起:java.lang.IllegalArgumentException:属性'driverClassName'不能为空

IllegalArgumentException:接收方未注册

IllegalArgumentException 介绍

java.lang.IllegalArgumentException:基本 URI 不能为空