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
相关产品推荐
相关产品推荐

