Android计算器C按钮异常及StringIndexOutOfBoundsException问题求助
问题分析与修复方案
两个核心问题:
- 点击C触发索引越界异常:当输入框为空时,
dataToCalculate.length()-1会得到-1,而substring(0, -1)属于非法操作,直接抛出StringIndexOutOfBoundsException。 - 点击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
相关产品推荐
相关产品推荐

