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

Android获取Double变量值时出现FATAL EXCEPTION崩溃问题求助

问题根源
  • 核心报错是NumberFormatException,从崩溃日志可以看到,总金额大于1000时显示的字符串携带千位分隔符逗号(比如1,008.00),Java原生的Double.parseDouble()无法识别带逗号的数字格式,直接解析就会抛出异常。
  • 原有代码存在逻辑漏洞:还没判断折扣率输入是否为空,就先调用了Double.parseDouble(input_rate.getText().toString()),如果用户没填折扣率直接点击按钮,这里也会直接触发崩溃。
  • 原本的try-catch仅包裹了折扣计算逻辑,没有覆盖总金额、折扣率的解析步骤,抛出的异常未被捕获直接导致应用崩溃。
  • 原有折扣率为空的判断逻辑完全无效:将Double类型的discountRate和空字符串做相等对比,永远不会返回true。
修复方案

调整逻辑顺序,先做输入非空校验,再执行类型转换;解析总金额前先删除字符串中的千位分隔符逗号;将所有可能抛出NumberFormatException的步骤都纳入try-catch块做异常捕获,避免应用直接崩溃。
修复后代码如下:

calculate.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String rateStr = input_rate.getText().toString().trim();
        // 先校验折扣率是否为空
        if(rateStr.isEmpty()){
            Toast.makeText(CreateInvoiceActivity.this, "Discount Rate is Empty", Toast.LENGTH_SHORT).show();
            return;
        }

        try {
            Double discountRate = Double.parseDouble(rateStr);
            // 移除总金额字符串中的千位分隔符逗号
            String totalStr = invoiceTotal.getText().toString().trim().replace(",", "");
            Double totalValue = Double.parseDouble(totalStr);

            Double discount = totalValue * (discountRate / 100);
            Toast.makeText(CreateInvoiceActivity.this, "Discount is" + discount, Toast.LENGTH_SHORT).show();
        }catch (NumberFormatException e){
            // 捕获所有格式错误场景,给用户友好提示
            Toast.makeText(CreateInvoiceActivity.this, "输入的金额或折扣率格式不正确", Toast.LENGTH_SHORT).show();
        }
    }
});
优化建议

如果你的应用有多语言适配需求,不同地区的千位分隔符可能是点号、空格等格式,可以使用NumberFormat类适配不同区域的数字格式,兼容性更强;也可以给折扣率输入框、总金额显示控件增加格式限制,从源头避免非法字符出现。

内容的提问来源于stack exchange,提问作者The Ark D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:36:06