You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已处理错误但空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)
    }
}

关键修改点说明

  1. 调整执行顺序:先获取trim后的字符串,先判断空值,再做类型转换
  2. 添加异常捕获:用try-catch捕获NumberFormatException,避免输入非数字内容时崩溃
  3. 使用可空变量存储转换结果:方便后续判断输入是否合法,只有当两个输入都验证通过后,才执行后续计算逻辑
  4. 优化空值判断逻辑:直接用isEmpty()替代之前的length == 0,代码更简洁

内容的提问来源于stack exchange,提问作者Apollo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:09:08