致命例外:主KotlinNullPointerException

这是我第一次构建一个android应用程序。 但是,当我在我的虚拟设备上运行应用程序,它停止工作,并不断崩溃。 该错误说明了有关空指针exception的情况。 这是我第一次使用Kotlin和我用Java编码,并改为Kotlin。

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_add_sales) val date: EditText? = null val changeDate: CheckBox? = null val yes: RadioButton? = null val no: RadioButton? = null date!!.setText("15-11-2017") date.isEnabled = false val button2 = findViewById(R.id.btnSubmit) as Button button2.setOnClickListener { var name = findViewById(R.id.name) as EditText var cost = findViewById(R.id.cost) as EditText val itemcost = Integer.parseInt(cost!!.text.toString()) var price = findViewById(R.id.price) as EditText val itemprice = Integer.parseInt(price!!.text.toString()) var qty = findViewById(R.id.quantity) as EditText var chgDate = false var discount = false val toast = Toast(applicationContext) if (itemprice < itemcost) { price!!.error = "Selling price cannot be lower than item price!" } else { if (changeDate!!.isChecked) { chgDate = true date.isEnabled = true } if (yes!!.isChecked) { discount = true } } Toast.makeText(this@AddSales, "Item Name: " + name!!.text + "\n" + "Cost: " + cost!!.text + "\n" + "Item Price: " + price!!.text + "\n" + "Quantity: " + qty!!.text + "Date: " + date + "Staff Discount: " + discount, Toast.LENGTH_SHORT).show() } } 

和错误是:

11-17 06:23:34.603 3540-3540 / com.example.ruiru.salestracker E / AndroidRuntime:致命例外:主进程:com.example.ruiru.salestracker,PID:3540 java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.ruiru.salestracker / com.example.ruiru.salestracker.AddSales}:android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)在android.app.ActivityThread.handleLaunchActivity(ActivityThread中)的kotlin.KotlinNullPointerException。 java:2892)在android.app.ActivityThread.-wrap11(未知源:0)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1593)在android.os.Handler.dispatchMessage(Handler.java:105 )在android.os.Looper.loop(Looper.java:164)在android.app.ActivityThread.main(ActivityThread.java:6541)在com.android java.lang.reflect.Method.invoke(本地方法)。 internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)引起:kotlin.KotlinNullPointerExceptio n在com.example.ruiru.salestracker.AddSales.onCreate(AddSales.kt:25)在android.app.Activity.performCreate(Activity.java:6975)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)在android.app.ActivityThread.delay11(Unknown Source:0)上的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)上的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)。在android.app.ActivityThread.main上的android.os.Looper.loop(Looper.java:164)上的android.os.Handler.dispatchMessage(Handler.java:105)上的ActivityThread $ H.handleMessage(ActivityThread.java:1593) (ActivityThread.java:6541)at com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)at com.android.internal.os java.lang.reflect.Method.invoke(Native Method) .ZygoteInit.main(ZygoteInit.java:767)

好像你忘了初始化date editText。 为什么不试试Kotlin Android扩展插件 。 通过使用这个插件,你不需要初始化视图,而是可以直接使用他们的ID。 对于你的情况:只需添加导入

 import kotlinx.android.synthetic.main.activity_add_sales.* 

那么你现在可以删除你的:

 val date: EditText? = null val changeDate: CheckBox? = null val yes: RadioButton? = null val no: RadioButton? = null 

你可以通过他们的ID访问它们。 喜欢

 date.setText("15-11-2017") 
 val date: EditText? = null val changeDate: CheckBox? = null val yes: RadioButton? = null val no: RadioButton? = null 

在使用这些variables之前,使用findViewById它们进行初始化或将它们绑定到xml视图。

因为你的日期EditText是null。在使用editText之前,像这样初始化edittext

 var date = findViewById(R.id.date) as EditText 

然后设置日期的值

 date!!.setText("15-11-2017") date.isEnabled = false