【问题标题】:FATAL EXCEPTION: main KotlinNullPointerException致命异常:主要 KotlinNullPointerException
【发布时间】:2018-04-30 20:52:27
【问题描述】:

这是我第一次构建 Android 应用程序。但是,当我在我的虚拟设备上运行该应用程序时,它停止工作并不断崩溃。该错误说明了有关空指针异常的信息。这是我第一次使用 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<View>(R.id.btnSubmit) as Button
    button2.setOnClickListener {
        var name = findViewById<View>(R.id.name) as EditText
        var cost = findViewById<View>(R.id.cost) as EditText
        val itemcost = Integer.parseInt(cost!!.text.toString())
        var price = findViewById<View>(R.id.price) as EditText
        val itemprice = Integer.parseInt(price!!.text.toString())
        var qty = findViewById<View>(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: 致命异常: main 进程:com.example.ruiru.salestracker,PID:3540 java.lang.RuntimeException:无法启动活动 组件信息{com.example.ruiru.salestracker/com.example.ruiru.salestracker.AddSales}: kotlin.KotlinNullPointerException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.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) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 引起:kotlin.KotlinNullPointerException 在 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.performLaunchActivity(ActivityThread.java:2770) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.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) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

  • date!!.setText("15-11-2017") 您声明为空的日期。并且您将文本设置为空变量。初始化查看日期后设置文本。

标签: android kotlin


【解决方案1】:

您的 EditText 为空。您可以初始化您的 EditText。示例 Kotlin 代码,

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_add_sales)

    val date = findViewById<EditText>(R.id.editTextDate)
    date.apply {
        setText("15-11-2017")
        isEnabled = false
    }
  }

【讨论】:

    【解决方案2】:

    因为您的日期 EditText 为空。在使用 editText 之前像这样初始化 editText

    var date = findViewById<View>(R.id.date) as? EditText
    

    然后设置日期的值

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

    【讨论】:

      【解决方案3】:

      您好像忘记初始化dateeditText。为什么不试试Kotlin Android Extension plugin。通过使用此插件,您无需初始化视图,而是可以使用它们的 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")
      

      【讨论】:

        【解决方案4】:
        val date: EditText? = null
        val changeDate: CheckBox? = null
        val yes: RadioButton? = null
        val no: RadioButton? = null
        

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

        【讨论】:

          猜你喜欢
          • 2012-03-04
          • 2012-06-02
          • 2012-09-08
          • 2014-02-07
          • 2012-10-12
          • 2014-04-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多