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

Android电费计算器应用Compute按钮点击崩溃问题排查求助

问题分析与解决方案

崩溃原因

点击Compute按钮崩溃的核心问题是:你从ConsumptionTv中获取的文本是带后缀kWh的格式化字符串(例如123.45 kWh),直接调用Double.parseDouble(consumption)时,因为字符串包含非数字字符,会抛出NumberFormatException,导致应用崩溃。

解决方案

提供两种可靠的解决方式,任选其一即可:


方式一:提取TextView中的纯数字部分转换

修改Compute按钮的点击事件代码,先移除字符串中的 kWh后缀,再进行转换:

ComputeBtn = (Button) findViewById(R.id.btnCompute);
ComputeBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View compute) {
        String rate, consumption;
        rate = RateEdt.getText().toString();
        consumption = ConsumptionTv.getText().toString();
        
        if(RateEdt.length() == 0){
            RateEdt.setError("Rate is required.");
            return;
        }
        // 判断是否已计算用电量
        if(consumption.isEmpty() || !consumption.contains("kWh")){
            Toast.makeText(MainActivity.this, "请先点击Calculate计算用电量", Toast.LENGTH_LONG).show();
            return;
        }
        // 提取纯数字部分
        consumption = consumption.replace(" kWh", "");
        try {
            Double rateDbl, cbillDbl, consumptionDbl;
            rateDbl = Double.parseDouble(rate);
            consumptionDbl = Double.parseDouble(consumption);
            
            cbillDbl = consumptionDbl * rateDbl;
            String billStr = String.format("Php %.2f", cbillDbl);
            ElectricBillTv.setText(billStr);
        } catch (NumberFormatException e) {
            Toast.makeText(MainActivity.this, "数据格式错误", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }
});

方式二:直接复用类成员变量存储计算结果(更推荐)

你已经在Calculate按钮中计算出了consumptionDbl,但当前是局部变量,改为使用类成员变量存储,这样Compute按钮无需从TextView读取字符串转换,彻底避免格式问题:

  1. 保留类成员变量Double rateDbl, cbillDbl, consumptionDbl, prevDbl, currentDbl;,删除Calculate按钮中的局部变量声明:
// 移除这行局部变量声明:Double prevDbl, currentDbl, consumptionDbl;
prevDbl = Double.parseDouble(prev);
currentDbl = Double.parseDouble(current);
  1. 计算后赋值给类成员变量:
consumptionDbl = currentDbl - prevDbl;
String consumptionStr = String.format("%.2f kWh", consumptionDbl);
ConsumptionTv.setText(consumptionStr);
  1. 修改Compute按钮代码,直接使用类成员变量:
ComputeBtn = (Button) findViewById(R.id.btnCompute);
ComputeBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View compute) {
        String rate = RateEdt.getText().toString();
        
        if(RateEdt.length() == 0){
            RateEdt.setError("Rate is required.");
            return;
        }
        // 判断是否已计算用电量
        if(consumptionDbl == null){
            Toast.makeText(MainActivity.this, "请先点击Calculate计算用电量", Toast.LENGTH_LONG).show();
            return;
        }
        try {
            rateDbl = Double.parseDouble(rate);
            cbillDbl = consumptionDbl * rateDbl;
            String billStr = String.format("Php %.2f", cbillDbl);
            ElectricBillTv.setText(billStr);
        } catch (NumberFormatException e) {
            Toast.makeText(MainActivity.this, "费率格式错误", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }
});

额外提示

  • 建议在Compute按钮点击时,先判断用户是否已经点击过Calculate计算出用电量,避免空值或未计算的情况。
  • 添加try-catch捕获NumberFormatException,能有效提升应用稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:25:27