Android Studio(Giraffe)单位换算APP点击千米/英里转换时崩溃求助
问题解决:单位换算APP千米/英里转换崩溃
核心问题分析
- 变量与控件ID绑定错误:初始化EditText时,
etMilesToKilometers和etKilometersToMiles对应的ID搞反了,导致点击按钮时读取的是错误的输入控件,这会引发逻辑错误甚至空指针问题。 - 未处理数字格式异常:直接调用
toDouble()时,若输入框为空或输入非数字字符,会抛出NumberFormatException,这是点击按钮后APP崩溃的主要原因。
修正后的代码
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 修正控件与ID的对应关系 val etInchesToCentimeters = findViewById<EditText>(R.id.etInchesToCentimeters) val etCentimeterToInches = findViewById<EditText>(R.id.etCentimetersToInches) val etKilometersToMiles = findViewById<EditText>(R.id.etKilometersToMiles) val etMilesToKilometers = findViewById<EditText>(R.id.etMilesToKilometers) val tvInchesToCentimeters = findViewById<TextView>(R.id.tvInchesToCentimeterResult) val tvCentimetersToInches = findViewById<TextView>(R.id.tvCentimetersToInchesResult) val tvKilometersToMiles = findViewById<TextView>(R.id.tvKilometersToMilesResult) val tvMilesToKilometers = findViewById<TextView>(R.id.tvMilesToKilometersResult) val btnInchesToCentimeters = findViewById<Button>(R.id.btnInchestoCentimeters) val btnCentimetersToInches = findViewById<Button>(R.id.btnCetimetersToInches) val btnKilometersToMiles = findViewById<Button>(R.id.btnKilometersToMiles) val btnMilesToKilometers = findViewById<Button>(R.id.btnMilesToKilometers) // 英寸转厘米 btnInchesToCentimeters.setOnClickListener(){ val input = etInchesToCentimeters.text.toString().trim() if (input.isNotEmpty()) { try { val inches = input.toDouble() val result = inches * 2.54 tvInchesToCentimeters.text = result.toString() Toast.makeText(applicationContext, "已转换英寸到厘米", Toast.LENGTH_SHORT).show() } catch (e: NumberFormatException) { Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show() } } // 厘米转英寸 btnCentimetersToInches.setOnClickListener(){ val input = etCentimeterToInches.text.toString().trim() if (input.isNotEmpty()) { try { val centimeter = input.toDouble() val result = centimeter * 0.393701 tvCentimetersToInches.text = result.toString() Toast.makeText(applicationContext, "已转换厘米到英寸", Toast.LENGTH_SHORT).show() } catch (e: NumberFormatException) { Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show() } } // 千米转英里 btnKilometersToMiles.setOnClickListener() { val input = etKilometersToMiles.text.toString().trim() if (input.isNotEmpty()) { try { val kilometer = input.toDouble() val result = kilometer * 0.621371 tvKilometersToMiles.text = result.toString() Toast.makeText(applicationContext, "已转换千米到英里", Toast.LENGTH_SHORT).show() } catch (e: NumberFormatException) { Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show() } } // 英里转千米 btnMilesToKilometers.setOnClickListener() { val input = etMilesToKilometers.text.toString().trim() if (input.isNotEmpty()) { try { val mile = input.toDouble() val result = mile * 1.609344 tvMilesToKilometers.text = result.toString() Toast.makeText(applicationContext, "已转换英里到千米", Toast.LENGTH_SHORT).show() } catch (e: NumberFormatException) { Toast.makeText(applicationContext, "请输入有效数字", Toast.LENGTH_SHORT).show() } } else { Toast.makeText(applicationContext, "请输入数值", Toast.LENGTH_SHORT).show() } } } }
关键修正点说明
- 修正控件绑定:调换
etMilesToKilometers和etKilometersToMiles对应的ID,确保变量指向正确的输入框。 - 添加输入校验:
- 先判断输入是否为空,为空时提示用户输入数值。
- 用
try-catch包裹toDouble()转换,捕获数字格式异常,避免APP崩溃,同时提示用户输入有效数字。
- 优化逻辑:将结果变量在点击事件内声明,无需全局定义未初始化的变量,减少潜在问题。
内容的提问来源于stack exchange,提问作者Imaginewagons
相关产品推荐
相关产品推荐

