-1

インフィックスをポストフィックスエクスプレスに変換できるアプリを実行しようとしています。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) != '-'

次のキャラクターをチェックしています。しかし、あなたがすでに終わりにいる場合はどうなりますか?これは、の終わりから実行している方法です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) != ')')

上記のコードは、演算子であるかどうかにかかわらず、次の文字を探します。

そして、あなたの for ループは input.length() まで続くので、for ループを次のように END より 1 ポジション少なくするようにします:

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) != '-'
                || 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 に答える