-1

我正在尝试做一个允许将中缀转换为后缀快递的应用程序。我只能对一位数执行此操作,但是当我对整个实数执行此操作时,它会显示错误!

public String doTrans() {
    for (int j = 0; j < input.length(); j++) {
        char ch = input.charAt(j);
        theStack.displayStack("For " + ch + " ");
        switch (ch) {
        case '+':
        case '-':
            gotOper(ch, 1);
            break;
        case '*':
        case '/':
            gotOper(ch, 2);
            break;
        case '(':
            theStack.push(ch);
            break;
        case ')':
            gotParen(ch);
            break;
        default:
            if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
                    || input.charAt(j + 1) != '/'
                    || input.charAt(j + 1) != '('
                    || input.charAt(j + 1) != ')')
                number = number + ch;
            else
                output = output + number;
            break;
        }
    }
    while (!theStack.isEmpty()) {
        theStack.displayStack("While ");
        output = output + theStack.pop();
    }
    theStack.displayStack("End ");
    return output;
}

这就是错误!

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 14
    at java.lang.String.charAt(String.java:658)
    at InToPost.doTrans(InToPost.java:33)
    at InfixApp.main(InfixApp.java:15)

if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'...

整个程序很长,这里不能发!

最后编辑

default:
                if (j != input.length() - 1) {
                    if (input.charAt(j + 1) != '+'
                            || input.charAt(j + 1) != '-'
                            || input.charAt(j + 1) != '/'
                            || input.charAt(j + 1) != '('
                            || input.charAt(j + 1) != ')')
                        number = number + ch;
                    else
                        output = output + number;
                } else
                    output = output + number;
                break;
4

4 回答 4

1

你的循环这样做:

for (int j = 0; j < input.length(); j++) {
    ...

后来你做

if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'

为此,您的循环必须以 结束input.length() - 1,否则您将StringIndexOutOfBoundsException在最后一次迭代中得到。

于 2013-03-20T17:43:09.317 回答
0
 if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
                    || input.charAt(j + 1) != '/'
                    || input.charAt(j + 1) != '('
                    || input.charAt(j + 1) != ')')

上面的代码查找下一个字符是否是运算符。

你的for循环一直到input.length(),所以只需让for循环比END少一个位置,如下所示:

for(int j = 0; j < input.length()-1; j++) // 这样循环代码就可以安全地引用最后一个字符。

于 2013-03-20T17:48:58.730 回答
0

在这一行

if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'

您正在检查下一个字符。但是如果你已经到了最后呢?这就是你如何从String. 在测试下一个字符之前,您需要单独检测这种情况(字符串结尾)。

于 2013-03-20T17:44:19.157 回答
0
        if (input.charAt(j + 1) != '+' || input.charAt(j + 1) != '-'
                || input.charAt(j + 1) != '/'
                || input.charAt(j + 1) != '('
                || input.charAt(j + 1) != ')')
            number = number + ch;
        else
            output = output + number;

一个简单的元规则是 || 这里应该是 && 因为 !=。

大概都应该是:

number += ch;
于 2013-03-20T17:46:47.123 回答