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

