NullPointerException en Kotlin

Cuando escribo este código en la actividad de kotlin

var tv: TextView = findViewById(R.id.tv_kotlin) as TextView 

Siempre falla con el siguiente error:

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference 

Y descubro que cuando convierto mis códigos Java en códigos kotlin, el convertidor automático siempre hace esto:

 private var btn: Button? = null 

Y cuando uso la reference, ¡tengo que poner una !! detrás de él, lo que hace que los códigos sean realmente feos. Entonces, ¿cuál es la forma correcta de vincular la IU en Android kotlin?

El código completado:

 class JavaToKotlinActivity : AppCompatActivity() { private var tv: TextView = findViewById(R.id.tv) as TextView private var btn: Button? = null private var et: EditText? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_java_to_kotlin) initView() } private fun initView() { btn = findViewById(R.id.btn) as Button et = findViewById(R.id.et) as EditText btn!!.setOnClickListener { tv.text = "haha" } et!!.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { } override fun afterTextChanged(s: Editable) { } }) } } 

Y los posts de error:

 06-09 14:25:38.574 9770-9770/com.mimi E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mimi, PID: 9770 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mimi/com.mimi.Views.JavaToKotlinActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2488) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2643) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5799) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:116) at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:147) at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:27) at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:50) at android.support.v7.app.AppCompatDelegateImplV23.<init>(AppCompatDelegateImplV23.java:29) at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:199) at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:181) at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:521) at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190) at com.mimi.Views.JavaToKotlinActivity.<init>(JavaToKotlinActivity.kt:20) at java.lang.Class.newInstance(Native Method) at android.app.Instrumentation.newActivity(Instrumentation.java:1072) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2478) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2643) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5799) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 

Debe enlazar sus vistas después de setContentView(R.layout.activity_java_to_kotlin)

si no quieres usar el tipo que admite nulos:

 private lateinit var tv: TextView 

y en initView()

 tv = findViewById(R.id.tv) as TextView 

Y no te olvides de la rotation de la pantalla.

Puede intentar aplicar el complemento: 'kotlin-android-extensions', puede usar directamente el ID de View

Retire la vista superior de text de su código,

tv privada de var: TextView = findViewById (R.id.tv) como TextView

y debe hacer así.

 class JavaToKotlinActivity : AppCompatActivity() { private var tv: TextView? = null private var btn: Button? = null private var et: EditText? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_java_to_kotlin) initView() } private fun initView() { btn = findViewById(R.id.btn) as Button et = findViewById(R.id.et) as EditText tv = findViewById(R.id.tv) as TextView btn?.setOnClickListener{ tv?.text = "haha" } et?.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { } override fun afterTextChanged(s: Editable) { } }) } } 
  • Combinar arguments de constructor opcionales obligatorios y arbitrarios con Groovy
  • Error: no puede acceder a NotNull
  • ¿Por qué sumBy (selector) no devuelve Long?
  • No se pudo encontrar el método springBoot () para arguments - Spring Boot usando Kotlin
  • ¿Por qué la estructura de valores es diferente cuando se depura?
  • Crear una instancia de una cadena?
  • El conflicto de las properties sintéticas de Kotlin
  • Operator == no se puede aplicar a 'Long' e 'Int' en Kotlin
  • ¿Cómo se puede compartir un UUID como key principal en dos tablas usando Hibernate?
  • Android OutOfMemoryError: no se pudo asignar una asignación de bytes 57993496 con 16764448 bytes libres
  • Problemas al upload imágenes a Firebase