java.lang.IllegalArgumentException:指定为非空的参数为空:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull

java.lang.IllegalArgumentException : Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull

我遇到了这个错误

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter event

为线

override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent)

完整代码如下。此代码最初位于 java,我使用 Android Studio 将其转换为 Kotlin,但现在出现此错误。我尝试重建和清理项目,但没有用。

val action = supportActionBar //get the actionbar
action!!.setDisplayShowCustomEnabled(true) //enable it to display a custom view in the action bar.
action.setCustomView(R.layout.search_bar)//add the custom view
action.setDisplayShowTitleEnabled(false) //hide the title

edtSearch = action.customView.findViewById(R.id.edtSearch) as EditText //the text editor


//this is a listener to do a search when the user clicks on search button
edtSearch?.setOnEditorActionListener(object : TextView.OnEditorActionListener {
    override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent): Boolean {
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
         Log.e("TAG","search button pressed")  //doSearch()
         return true
        }
     return false
    }
})

最后一个参数可以是null,如docs所述:

KeyEvent: If triggered by an enter key, this is the event; otherwise, this is null.

所以您需要做的是让 Kotlin 类型可以为空来解决这个问题,否则注入的 null 检查会在您的应用程序收到带有 null 值的调用时崩溃您的应用程序已经看过了:

edtSearch?.setOnEditorActionListener(object : TextView.OnEditorActionListener {
    override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent?): Boolean {
        ...
    }
})

中有关平台类型的更多说明。

我遇到了类似的异常:"java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter title"。

然后研究了一个函数,发现一个参数变成了null,而must not:

class Item(
    val id: Int,
    val title: String,
    val address: String
)

当我像 Item(id, name, address) 那样调用它并且 namenull 时,我遇到了这个异常。

因此,将 ? 添加到所有可疑变量类型:val title: String?.

要解决此问题,如果您使用 TextView.OnEditorActionListener,请使 event 参数可为空。在声明末尾添加?

override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent?)

如果您将具有空值的参数从 Java class 传递给 Kotlin class [通过调用方法并在 classes 之间实现回调,则会发生此错误。

甚至将 null 传递给 Compiler 无法在编译时检测到的参数,因此会在 运行 时间内发生崩溃。

因为 Kotlin 是空安全的,所以应用程序会崩溃!

修复:通过添加 ? 将 kotlin 方法中的参数类型更改为可空类型到类型的末尾。

例如,您的 kotlin 函数将在 Java class 中被调用:

//java class file
 ClassKotlin cls = new ClassKotlin()
 cls.function1("name", null, true) //Call func from inside kotlin class

但是您在 ClassKotlin 中的 func 声明是:

//Kotlin class file
  ClassKotlin {
  fun function1(firstname : String , lastName : String , status : Bool){
  //...
  }
 } // class

所以你在 kotlin func 中将一个 null 值传递给了一个非 Null 参数。

如何修复:

只需将 Kotlin 函数更改为:

 fun function1(firstname : String , lastName : String? , status : Boolean){
  //...
  }

*一个?添加到字符串数据类型

isMinifyEnabled = false or remove this

在我的例子中,这个问题是由于 gradle 文件中的 isMinifyEnabled = true 行引起的。删除此行后它起作用了。

对我来说,它发生在旋转器适配器项目选择器上。 下面是正确的代码。

rootView.spinnerState.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
     }
            override fun onNothingSelected(parent: AdapterView<*>?) {}
        }

确保允许适配器和视图为空,即 (?)

我在这个问题上遇到了一些困难,我的问题是 converters class 提供给 Room 数据库 class。您可以仔细查看 class 和 根据它们对 可空性 [ 的预期更新变量 =22=].