已处理错误但空EditText仍导致Android应用崩溃问题求助
问题分析与解决方案
嘿,我一眼就发现导致崩溃的核心问题了:你在检查输入是否为空之前,就先执行了toDouble()和toInt()的类型转换!当EditText为空时,空字符串直接调用这些转换方法会抛出NumberFormatException,这时候你的空值判断逻辑根本没机会执行,直接就触发崩溃了。
修复思路
- 第一步先获取EditText的文本并做
trim()处理,先判断是否为空,为空直接提示错误 - 非空情况下,再尝试转换为数字,同时捕获可能的转换异常(比如输入了不符合格式的内容,虽然设置了inputType,但还是有极端情况)
- 重构逻辑,让输入验证的顺序更合理
修改后的完整代码
fun buildAlertDialog(message: String = "Bad input value") { val alertDialogBuilder = AlertDialog.Builder(this@MainActivity) alertDialogBuilder.setTitle("Error") alertDialogBuilder.setMessage(message) alertDialogBuilder.setNeutralButton("Close") { _, _ -> } val alertDialog: AlertDialog = alertDialogBuilder.create() alertDialog.show() } btnCalculate.setOnClickListener { // 先获取并处理输入字符串 val heightStr = editTxt_EnterHeight.text.toString().trim() val weightStr = editTxt_EnterWeight.text.toString().trim() // 验证身高输入 var heightInput: Double? = null if (heightStr.isEmpty()) { buildAlertDialog("Please enter height value") } else { try { heightInput = heightStr.toDouble() // 验证身高数值合法性 when { heightInput > 2.5 -> buildAlertDialog("Bad input value - too tall") heightInput == 0.0 -> buildAlertDialog("Bad input value - height value can't be zero") heightInput < 0 -> buildAlertDialog("Bad input value - height can't be a negative number") } } catch (e: NumberFormatException) { buildAlertDialog("Please enter a valid height number") } } // 验证体重输入 var weightInput: Int? = null if (weightStr.isEmpty()) { buildAlertDialog("Please enter weight value") } else { try { weightInput = weightStr.toInt() // 验证体重数值合法性 when { weightInput > 350 -> buildAlertDialog("Bad input value - too big weight value") weightInput == 0 -> buildAlertDialog("Bad input value - weight can't be zero") weightInput < 0 -> buildAlertDialog("Bad input value - weight can't be a negative number") } } catch (e: NumberFormatException) { buildAlertDialog("Please enter a valid weight number") } } // 如果两个输入都合法,这里可以继续执行计算逻辑 if (heightInput != null && weightInput != null) { // 比如计算BMI之类的逻辑写在这里 // val bmi = weightInput / (heightInput * heightInput) } }
关键修改点说明
- 调整执行顺序:先获取trim后的字符串,先判断空值,再做类型转换
- 添加异常捕获:用
try-catch捕获NumberFormatException,避免输入非数字内容时崩溃 - 使用可空变量存储转换结果:方便后续判断输入是否合法,只有当两个输入都验证通过后,才执行后续计算逻辑
- 优化空值判断逻辑:直接用
isEmpty()替代之前的length == 0,代码更简洁
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

