Android Studio中Kotlin的setOnClickListener调用calc()函数崩溃问题
解决Android应用点击按钮闪退的NumberFormatException问题
问题根源
从报错日志java.lang.NumberFormatException: empty String可以定位:你在onCreate()方法中提前获取了EditText的文本内容,此时EditText还没有用户输入,vi和height保存的是空字符串。当点击按钮调用toDouble()时,空字符串无法转换为Double类型,直接触发崩溃。
修复步骤
- 延迟文本获取时机:只在
onCreate()中获取EditText的控件实例,把文本读取操作移到按钮的点击事件内部,确保获取的是用户输入后的内容。 - 添加输入校验:在转换数字前检查输入是否有效,避免空值或非数字输入导致的异常。
修改后的代码
package com.example.fallingobject import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.Toast import kotlin.math.sqrt fun calc(vi: Double, height: Double): String { val a = 9.8 val vf = sqrt((vi * vi) + 2 * a * height) val va = (vf + vi) / 2 val t = height / va return t.toString() } class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val calcBtn = findViewById<Button>(R.id.calcBtn) // 只获取控件实例,不提前读取文本 val viInput = findViewById<EditText>(R.id.sIn) val heightInput = findViewById<EditText>(R.id.hIn) calcBtn.setOnClickListener { // 点击时才读取输入文本,trim()去除首尾空格 val viStr = viInput.text.toString().trim() val heightStr = heightInput.text.toString().trim() // 校验输入是否为空 if (viStr.isEmpty() || heightStr.isEmpty()) { Toast.makeText(this, "请输入完整的速度和高度", Toast.LENGTH_SHORT).show() return@setOnClickListener } // 安全转换为Double,避免非数字输入导致崩溃 val vi = viStr.toDoubleOrNull() val height = heightStr.toDoubleOrNull() if (vi == null || height == null) { Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show() return@setOnClickListener } val calculation = calc(vi, height) Toast.makeText(this@MainActivity, calculation, Toast.LENGTH_SHORT).show() } } }
额外优化建议
- 给EditText添加
hint属性,提示用户输入内容,比如在xml中添加android:hint="请输入初始速度" - 如果需要支持小数输入,把EditText的
inputType改为numberDecimal,方便用户输入非整数数值
内容的提问来源于stack exchange,提问作者goAT2160
相关产品推荐
相关产品推荐

