el timer se bloquea con KotlinNullPointerException dentro del fragment

Creé Timer (java.util.Timer) en Kotlin de esta manera:

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) buttonStart.setOnClickListener({ val timer = Timer("schedule", true) timer.scheduleAtFixedRate(1000, 1000) { if (timerViewModel?.timerValue?.value!! > 0){ timerViewModel?.timerValue?.value = timerViewModel?.timerValue?.value!! - 1 activity.runOnUiThread { textViewTimer.text = timerViewModel?.timerValue?.value?.toString() } } else { cancel() } } }) } 

Este código se bloquea en la 5ª línea con el error:

  kotlin.KotlinNullPointerException at com.dmitry.timer.views.TimerFragment$onViewCreated$1$$special$$inlined$scheduleAtFixedRate$1.run(Timer.kt:145) at java.util.Timer$TimerImpl.run(Timer.java:284) 

Cuando creo el timer dentro de la activity , funciona bien. ¿Cuál es el problema?

Me parece que textViewTimer o la activity es nula en esta línea:

 activity.runOnUiThread{...} 

¿Estás seguro de haberlo configurado adecuadamente?

En particular, no puede confiar en Fragment.getActivity() (solo activity aquí en Kotlin) para devolver un valor no nulo en puntos arbitrarios después de la creación. Como está ejecutando esto en un timer, es posible que getActivity devuelva nulo.

Aparte: los rastros de stack pueden ser confusos cuando se usan lambdas nesteds como este. Si miras detenidamente

 at com.dmitry.timer.views.TimerFragment$onViewCreated$1$$special$$inlined$scheduleAtFixedRate$1.run(Timer.kt:145) 

Puede ver el $1 después de la date de la scheduleAtFixedRate . Esa notación de signo de dólar a menudo se utiliza para referirse a methods anónimos o lambdas, y aquí creo que se refiere a su gestor de timer.

Además de la respuesta de Myk Willis, usted está combinando los operadores de llamada segura ( .? ) Y de llamada de NPE ( !! ).

Esto significa que si timerViewModel , timerViewModel.timerValue o timerViewModel.timerValue.value es null , eso también puede causar el NPE que está viendo. Negar efectivamente el beneficio de usar el operador de llamada segura.

  • Implemente y ejecute nodos dinámicamente en CORDA
  • Usando Mockito, ¿cómo espío la class Kotlin con la statement de campo val interface?
  • Dagger 2 - Inyectar con valor pnetworkingeterminado en el constructor
  • Custom Type Face en Kotlin por progtwig
  • Kotlin: cómo get el valor del atributo de anotación
  • Kotlin, adición genérica
  • solo se permite un object acompañante por class en Kotlin
  • ¿Cuál es la forma legítima de get annotations de una propiedad pura de Kotlin a través de la reflexión, siempre faltan?
  • Implementación de SQLite en Kotlin y Anko
  • Kotlin @JvmStatic y anulación accidental en un object complementario
  • Problema de properties genéricas de Kotlin