kotlin.Исключение UninitializedPropertyAccessException: прослушиватель свойств lateinit не был инициализирован

#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 Я обновил свой ответ кодом реализации