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

Android计算器C按钮异常及StringIndexOutOfBoundsException问题求助

问题分析与修复方案

两个核心问题:

  1. 点击C触发索引越界异常:当输入框为空时,dataToCalculate.length()-1会得到-1,而substring(0, -1)属于非法操作,直接抛出StringIndexOutOfBoundsException。
  2. 点击C后文本变成C:处理完C的截取逻辑后,后续的else分支又执行了dataToCalculate += buttonText,相当于把C重新追加到字符串里,导致看起来像是替换成了C。

修复后的代码

调整onClick方法的逻辑顺序,同时增加空值防护:

@Override
public void onClick(View v) {
    MaterialButton button = (MaterialButton) v;
    String buttonText = button.getText().toString();
    String dataToCalculate = textSolution.getText().toString();

    if (buttonText.equals("AC")) {
        textSolution.setText("");
        textResult.setText("0");
        return;
    } else if (buttonText.equals("C")) {
        // 字符串为空时不执行截取,避免异常
        if (!dataToCalculate.isEmpty()) {
            dataToCalculate = dataToCalculate.substring(0, dataToCalculate.length() - 1);
        }
        textSolution.setText(dataToCalculate);
        return;
    } else if (buttonText.equals("=")) {
        textSolution.setText(textResult.getText());
    } else {
        dataToCalculate = dataToCalculate + buttonText;
        textSolution.setText(dataToCalculate);
    }
}

关键改动说明:

  • 将C的判断改为else if并添加return,跳过后续的追加逻辑,避免把C重新加回字符串。
  • 增加!dataToCalculate.isEmpty()判断,确保只有字符串非空时才执行截取操作,彻底避免索引越界。
  • 每个分支单独处理文本更新,逻辑更清晰,不会出现重复操作。

另外补充一个潜在问题修复:你当前的assignId方法是按值传递参数,无法正确给成员变量赋值(比如btnC始终为null),可以修改为返回值形式:

MaterialButton assignId(int id) {
    MaterialButton btn = findViewById(id);
    btn.setOnClickListener(this);
    return btn;
}

然后在onCreate中调用:

btnC = assignId(R.id.button_c);
btnOpenBracket = assignId(R.id.button_open_bracket);
// 其他按钮同理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:52:44