Android Studio 我得到java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

wbrvyc0a  于 2023-06-24  发布在  Android
关注(0)|答案(1)|浏览(152)

大家好,我是android开发的新手,我目前正在尝试构建一个简单的计算器,但是当我单击c按钮时,它只会将最后一个字符变为“C”,这是我使用的代码行:

if (buttonText.equals("C")) {
            dataToCalculate = dataToCalculate.substring(0,dataToCalculate.length()-1);
        }


下面是完整的代码:

package com.example.icalculate;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.google.android.material.button.MaterialButton;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private TextView textResult, textSolution;
    private MaterialButton btnC,btnOpenBracket,btnClosedBracket,btnDivide;
    private MaterialButton btn7,btn8,btn9,btnMultiply;
    private MaterialButton btn4,btn5,btn6,btnPlus;
    private MaterialButton btn1,btn2,btn3,btnMinus;
    private MaterialButton btnAC,btn0,btnDot,btnEquals;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textResult = (TextView) findViewById(R.id.txtResult);
        textSolution = (TextView) findViewById(R.id.txtSolution);

        assignId(btnC, R.id.button_c);
        assignId(btnOpenBracket, R.id.button_open_bracket);
        assignId(btnClosedBracket, R.id.button_closed_bracket);
        assignId(btnDivide, R.id.button_divide);
        assignId(btn7, R.id.button_7);
        assignId(btn8, R.id.button_8);
        assignId(btn9, R.id.button_9);
        assignId(btnMultiply, R.id.button_multiply);
        assignId(btn4, R.id.button_4);
        assignId(btn5, R.id.button_5);
        assignId(btn6, R.id.button_6);
        assignId(btnPlus, R.id.button_plus);
        assignId(btn1, R.id.button_1);
        assignId(btn2, R.id.button_2);
        assignId(btn3, R.id.button_3);
        assignId(btnMinus, R.id.button_minus);
        assignId(btnAC, R.id.button_ac);
        assignId(btn0, R.id.button_0);
        assignId(btnDot, R.id.button_dot);
        assignId(btnEquals, R.id.button_equals);
    }

    void assignId(MaterialButton btn, int id) {
        btn = findViewById(id);
        btn.setOnClickListener(this);

    }

    @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;
        }
        if (buttonText.equals("C")) {
            dataToCalculate = dataToCalculate.substring(0,dataToCalculate.length()-1);
        }
        if (buttonText.equals("=")) {
            textSolution.setText(textResult.getText());
        }else {
            dataToCalculate = dataToCalculate+buttonText;
        }
        textSolution.setText(dataToCalculate);

    }
}
sq1bmfud

sq1bmfud1#

这里的情况不止一种。
首先,如果遇到 StringIndexOutOfBoundsException,则意味着 dataToCalculate 的长度为0。
因为,dataToCalculate.length()- 1,在长度为0时,将返回-1。
您可以通过首先检查长度来解决这个问题-我通常使用 String#isEmpty

if (!dataToCalculate.isEmpty()) {
    dataToCalculate = dataToCalculate.substring(0,dataToCalculate.length()-1);
}

此外,您可以将代码简化为以下内容。

switch (buttonText) {
    case "AC" -> {
        textSolution.setText("");
        textResult.setText("0");
        return;
    }
    case "C" -> {
        if (!dataToCalculate.isEmpty())
            dataToCalculate = dataToCalculate.substring(0, dataToCalculate.length() - 1);
    }
    case "=" -> textSolution.setText(textResult.getText());
    default -> dataToCalculate = dataToCalculate+buttonText;
}
textSolution.setText(dataToCalculate);

相关问题