非法参数异常:指定为非空的参数为空。

67

我遇到了以下运行时错误

 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
没有问题,请提出一个问题以获取帮助。 - guenhter
5个回答

115

例外情况非常明显:您正在为参数传递null

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

fun fetchMerchantHashes(intent: Intent?)

更多信息请参见:null-safety


1
我曾经遇到过同样的问题,不得不阅读 Kotlin 文档。我有点知道我的代码哪里出了问题,但为了进一步澄清我从 Kotlin 文档中理解的内容,最终我来到了这个页面,发现你的答案与我所想的完全相符。你的回答清晰简洁。 - Yosidroid

4
在我的案例中,这个错误警告了一个可能传递空参数的问题。有三种纠正方法。
  1. 在相应的位置更改参数的类型。如果它是从Java接收的,请在变量定义中添加@NonNull注释。
  2. 在方法的参数中添加!!
  3. 在Kotlin类中的参数后添加?。我认为,如果在Java类中没有使用注释(如@Nullable@NonNull),那么Kotlin转换工具可能会默认执行此操作。

1
错误不等于警告,警告也不等于错误。添加!!可能会导致空指针异常,因为你在运行时断言它是非空的,但实际上它是空的。 - ezaspi
@ezaspi,我同意你的观点。我会添加一个?的情况。过去我设置了!!来查看运行时崩溃,其中可能发生NPE。 - CoolMind
我们刚完成了一个大型的Android到Kotlin重构,那些讨厌的!!比之前存在的可能为空的值更糟糕。例如,在Android中调用abc(String somevalue)方法被转换为Kotlin(由转换器)abc(somevalue: String!!)。在转换之前,abc处理了空值,但在转换后立即抛出NPE。有人可能会认为我们应该有一个@Nullable,但这是一个大项目,所以我们没有全部捕捉到。只需要一个就可以使应用程序崩溃。 - ezaspi
1
顺便说一下,如果只是我们的代码,情况就不会那么糟糕。但是很多Android覆盖没有@Nullable注释。因此,在自动转换完成后,代码可能会变成这样:override fun onItemSelected(parentView: AdapterView<*>, selectedItemView: View, position: Int, id: Long) 但它应该是一个可为空的View吗?因为这经常会导致崩溃。 - ezaspi
@ezaspi,我完全同意你的看法,而且也多次遇到这些问题。这是自动转换器的一个缺点。抱歉,我在一年前学习Kotlin时写下了这个答案。 - CoolMind

3

简单的回答一定有效... 当您使用Rest Client(网络服务调用) (GET或POST)从服务器获取数据时,如果json响应中可能存在空参数值,并且您正在获取参数并将其附加到textview中,则会出现此错误。

解决方案: 只需在变量后面添加?号,如下所示。

示例:

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

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


1
我使用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进行转换,它会猜测它可能为空。 - CoolMind

0
对于每个绑定适配器,将item参数的类型更改为可空,并用...包装函数体。

item?.let{...}

源代码在谷歌文档中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接