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

Kotlin开发Android小费计算器点击计算按钮触发应用崩溃

崩溃原因

你的代码存在3个直接触发崩溃的问题,还有1个逻辑隐患:

  • 错误获取EditText输入内容:textField.toString()获取的是EditText控件实例的对象描述字符串,不是用户输入的文本,这个字符串不是合法数字,调用Integer.parseInt()时会直接抛出NumberFormatException导致应用崩溃。正确获取输入内容的方式是调用textField.text.toString()。
  • 数值类型不匹配:你的EditText设置了android:inputType="numberDecimal",支持用户输入小数金额,但Integer.parseInt()只能解析整数字符串,一旦用户输入带小数点的数值(比如39.9),转换时会直接抛异常崩溃。
  • 缺少异常兜底:你没有对输入为空、输入非数字、RadioGroup未选中任何选项的边界场景做判断,这些场景下都会触发崩溃或逻辑异常。
  • 交互逻辑缺陷:你把计算结果直接写回原价格输入框,用户后续再次点击计算时,会把上次生成的计算结果作为输入值二次计算,很容易触发转换错误。
修复方案

替换原有calculate()方法为以下实现:

private fun calculate() {
    val tipButtons: RadioGroup = findViewById(R.id.tip_options)
    val costInput: EditText = findViewById(R.id.cost_of_service)
    // 获取用户真实输入,去除首尾空白字符
    val inputContent = costInput.text.toString().trim()

    // 拦截空输入
    if (inputContent.isEmpty()) {
        costInput.error = "请输入服务价格"
        return
    }

    // 安全转换为Double类型,支持小数,转换失败直接拦截
    val serviceCost = inputContent.toDoubleOrNull()
    if (serviceCost == null || serviceCost <= 0) {
        costInput.error = "请输入大于0的有效价格"
        return
    }

    // 拦截未选中小费档位的场景
    val selectedId = tipButtons.checkedRadioButtonId
    if (selectedId == -1) {
        Toast.makeText(this, "请选择小费档位", Toast.LENGTH_SHORT).show()
        return
    }

    // 匹配对应小费比例
    val tipRate = when (selectedId) {
        R.id.amazing -> 0.20
        R.id.good -> 0.18
        R.id.okay -> 0.15
        else -> 0.0
    }

    val tipAmount = serviceCost * tipRate
    // 保留两位小数写回输入框,如果不需要写回输入框,建议新增单独的TextView展示结果
    costInput.setText(String.format("%.2f", tipAmount))
}
优化建议
  • 建议新增独立的TextView控件展示小费计算结果,不要复用价格输入框展示结果,避免二次计算出现逻辑错误。
  • 可以给RadioGroup设置默认选中项,减少用户未选择档位的异常场景。
  • 所有字符串转数值的操作,优先使用Kotlin提供的toIntOrNull()/toDoubleOrNull()安全转换方法,不要直接调用会抛出异常的解析方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:45:58