NullPointerException在Kotlin中

当我在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代码时,auto转换器总是这样做:

 private var btn: Button? = null 

而当我使用的参考,我必须把! 背后它使代码真丑。那么在kotlin android绑定UI的正确方法是什么?

完成的代码:

 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.(AppCompatDelegateImplBase.java:116) at android.support.v7.app.AppCompatDelegateImplV9.(AppCompatDelegateImplV9.java:147) at android.support.v7.app.AppCompatDelegateImplV11.(AppCompatDelegateImplV11.java:27) at android.support.v7.app.AppCompatDelegateImplV14.(AppCompatDelegateImplV14.java:50) at android.support.v7.app.AppCompatDelegateImplV23.(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.(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)

如果你不想使用可空types:

 private lateinit var tv: TextView 

并在initView()

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

不要忘记屏幕旋转。

你可以尝试应用插件:’kotlin-android-extensions’,你可以直接使用View id

从代码中删除顶部的TextView,

作为TextView的私人变种电视:TextView = findViewById(R.id.tv)

而且应该这样做。

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