#kotlin #exception #listener
#kotlin #исключение #прослушиватель
Вопрос:
Я создал прослушиватель обратного вызова между моими двумя классами. Когда я выполняю программу, я получаю kotlin.UninitializedPropertyAccessException: lateinit property listener has not been initialized
эту ошибку
Вот мой код, в котором я устанавливаю список
val process = Example()
process.setListener(object: CallBackListener{
override fun onMessageReveiced(msg: String) {
sendString = msg
}
})
Вот мой код, в котором я инициализирую прослушиватель и устанавливаю значение для отправки
class Example{
private lateinit var listener: CallBackListener
fun setListener(listener : CallBackListener){
this.listener = listener
}
fun doSomething(){
...///do somethin
listener.onMessageReveiced(rMessage)
}
}
В чем моя проблема?
Комментарии:
1. Возможно, потому
doSomething()
, что вызывается раньшеsetListener
. Перед вызовом необходимо инициализировать переменную прослушивателя. На всякий случай вы можете проверить инициализирован перед вызовом, какif(::listener.isInitialized) { listener.onMessageReceived("...") }
2. Какая строка вызывает исключение?
3. @DCruz22 listener.onMessageReveiced(rMessage) эта строка
4. @ChampChayangkoon я так не думаю, потому что я вызываю setListener в начале функции, кстати, я добавил safe, но теперь не попадаю внутрь
5. Попробуйте установить прослушиватель в конструкторе, чтобы убедиться, что свойство инициализируется с помощью класса.
Ответ №1:
Попробуйте установить прослушиватель в конструкторе, чтобы убедиться, что свойство инициализируется с помощью класса. Пример:
class Example(val listener: CallBackListener){
fun doSomething(){
...///do somethin
listener.onMessageReveiced(rMessage)
}
}
Или, если вы хотите сохранить переменную lateinit и иметь возможность обновлять прослушиватель позже, вы можете использовать init для инициализации свойства:
class Example(cbListener: CallBackListener){
private lateinit var listener: CallBackListener
init{
this.listener = cbListener
}
fun setListener(listener : CallBackListener){
this.listener = listener
}
fun doSomething(){
...///do somethin
listener.onMessageReveiced(rMessage)
}
}
В вашем классе реализации:
val process = Example(object: CallBackListener{
override fun onMessageReveiced(msg: String){
//your code
}
})
Комментарии:
1. Но как я могу указать интерфейсы в качестве параметра? И когда я добавляю в качестве конструктора, мне нужно также передать значение для того, где я установил прослушиватель…
2. @saulyasar Я обновил свой ответ кодом реализации