访问String中的字符时,字符串索引超出范围

时间:2015-09-19 12:20:06

标签: java string calculator infix-notation rpn

我正在尝试制作RPN计算器。我已完成从中缀到后缀的转换,现在我想评估转换后的表达式。当我输入任何表达式时,我会收到错误

  

字符串索引超出范围:1。

这是我的代码与我应该在该计划中做的事情:

static int eval(String postfix) {
    int result = 0;
    String temp2 = "";
    int num1, num2, OPS;
    char operator;
    String delete = "";


    for (int i = 0; i < postfix.length(); i++) {
        char M = postfix.charAt(i);

        // if v_i is an operand: Push v_i to tmp2.
        if (Character.isDigit(postfix.charAt(i))) {
            temp2 = M + temp2;
        }

        /*
         * if v_i is an operator: Apply v_i to the top two elements of tmp2.
         * Replace these by the result in tmp2.
         */
        if (postfix.charAt(i) == '+' || postfix.charAt(i) == '-' || postfix.charAt(i) == '*'
                || postfix.charAt(i) == '/') {

            temp2 = M + temp2.substring(2);

        }

        while (postfix.charAt(0) != '0') {
            num1 = Character.getNumericValue(temp2.charAt(temp2.length()-1));
            delete = delete.substring(0,i);
            operator = postfix.charAt(i);

            num2 = Character.getNumericValue(temp2.charAt(temp2.length()+i));
                    //Integer.parseInt(postfix.substring(0,i));

            result = num1 + num2;
            result = num1 - num2;
            result = num1 * num2;
            result = num1 / num2;

            switch (operator) {

            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = num1 / num2;
                break;

            }
        }


        if (temp2.length() != 0) {
            temp2 = result + temp2;
        }

    }
    return result;
}

我在这部分得到错误:

while (postfix.charAt(0) != '0') {
            num1 = Character.getNumericValue(temp2.charAt(temp2.length()-1));
            delete = delete.substring(0,i);
            operator = postfix.charAt(i);

            num2 = Character.getNumericValue(temp2.charAt(temp2.length()+i));
                    //Integer.parseInt(postfix.substring(0,i));

正如您所看到的,我尝试了一些不同的字符串操作,但它们都不正确。 我的主管说了一些关于从后面读取字符串或最后一串字符串的东西,但我从未明白它们的意思。感谢您提前提供任何帮助

2 个答案:

答案 0 :(得分:1)

temp2.charAt(temp2.length()+i)

您正在使用charAt访问字符串的字符。但是temp2包含temp2.length()个字符。因此,您可以从索引0到temp2.length() - 1访问它们。因此,访问位置temp2.length()+i处的角色超出范围...(对于i > 0 !!)

看看你之前的temp2.charAt(temp2.length()-1)。 在这里,您访问了字符串的最后一个字符(在索引temp2.length()-1处)。具有更大索引的任何访问都将导致索引超出范围。

编辑:你的while循环的停止条件是while (postfix.charAt(0) != '0')。在循环中,您永远不会更改postfix字符串。因此,如果满足条件(postfix的第一个字符不是'0'),您将拥有无限循环。因此,你永远不会到达退货声明。

答案 1 :(得分:0)

更改此行 Character.getNumericValue(temp2.​​charAt(temp2.​​length()+ I)); 至 Character.getNumericValue(temp2.​​charAt(temp2.​​length()+ I-1));