NullPointerException в Котлине

Когда я пишу этот код в kotlin деятельности

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

Он всегда срабатывает со следующей ошибкой:

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

И я нахожу, когда я конвертирую свои Java-коды в коды kotlin, автоматический конвертер всегда делает это так:

 private var btn: Button? = null 

И когда я использую ссылку, я должен поставить !! позади него, которые делают коды действительно уродливыми. Итак, каков правильный способ связывания UI в kotlin android?

Завершенный код:

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

И сообщения об ошибках:

 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) 

Вы должны привязать свои представления после setContentView(R.layout.activity_java_to_kotlin)

если вы не хотите использовать тип NULL:

 private lateinit var tv: TextView 

и в initView()

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

И не забывайте о вращении экрана.

Вы можете попробовать применить плагин: 'kotlin-android-extensions', вы можете напрямую использовать идентификатор View

Удалите верхний TextView из вашего кода,

private var tv: TextView = findViewById (R.id.tv) как TextView

и это должно сделать так.

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