Java.lang.IllegalArgumentException: параметр, заданный как ненулевой, равен null: метод 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, я преобразовал его в Kotlin с помощью Android Studio, но теперь я получаю эту ошибку. Я попытался восстановить и очистить проект, но это не сработало.

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

Ответ 1

Последний параметр может быть null, как описано docs:

KeyEvent: если это вызвано клавишей ввода, это событие; в противном случае это значение равно null.

Итак, что вам нужно сделать, это сделать тип Kotlin нулевым для учетной записи для этого, иначе инъецированная проверка null приведет к краху вашего приложения, когда он получит вызов с значением null, как вы уже видели:

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

Подробнее о типах плат в этом ответе.

Ответ 2

Чтобы решить эту проблему, нужно сделать параметр "событие" обнуляемым. Добавлять "?" в конце декларации.

переопределить забаву onEditorAction (v: TextView, actionId: Int, событие: KeyEvent?)

Ответ 3

Я получил похожее исключение: "java.lang.IllegalArgumentException: параметр, указанный как ненулевое, имеет значение null: метод kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, title ".

Затем исследовал функцию и нашел параметр, который стал null но не должен:

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

Когда я назвал его как Item(id, name, address) и name было null, я получил это исключение.

Ответ 4

Эта ошибка произойдет, если вы передадите параметры с нулевым значением из класса Java в класс Kotlin [путем вызова методов & реализован обратный вызов между классами].

И даже передать значение null параметру, который компилятор не сможет определить как время компиляции, поэтому сбой произойдет во время выполнения.

Потому что Kotlin абсолютно безопасен, поэтому приложение будет зависать!

Исправлено: Измените тип параметров в методе kotlin на Nullable типы, добавив? до конца типа.

Например, ваша функция kotlin будет вызываться в классе Java следующим образом:

var cls = ClassKotlin()
     cls.function1("name", null, true) //Call func inside kotlin class

но ваша функциональная декларация в ClassKotlin:

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

Итак, вы передали нулевое значение в ненулевой параметр в kotlin func.

Как исправить:

Просто измените функцию Kotlin следующим образом:

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

* а? добавлен в тип данных String