0

書かれた方程式が正しいかどうかを確認するメソッドがあります。

このメソッドは以下をチェックします。

  • 複数の括弧
  • 過剰なオペレーター
  • 二桁
  • q's
  • およびこれら以外の文字列内の任意の文字:

.

private static final String operators = "-+/*%_";
private static final String operands = "0123456789x";

正常に動作していましたが、モジュラーで演算子に追加し、コードがメソッドの部分に到達するたびに、オペランドの左と右をチェックして、文字列の終わりでも始まりでもないかどうかを確認しますというエラーが表示されます

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3

私の方法とすべての追加の方法です。

private static final String operators = "-+/*%_";
private static final String operands = "0123456789x";

public Boolean errorChecker(String infixExpr)
{
    char[] chars = infixExpr.toCharArray();
    StringBuilder out = new StringBuilder();

    for (int i = 0; i<chars.length; i++)
    {
        System.out.print(infixExpr.charAt(i));
        if (isOperator(infixExpr.charAt(i)))
        {
            if (i == 0 || i == infixExpr.length())
            {
                out.append(infixExpr.charAt(i));
            }
            else if (isOperator(infixExpr.charAt(i + 1)) && isOperator(infixExpr.charAt(i - 1)))
            {
                System.out.println("To many Operators.");
                return false;
            }
            else if (isOperator(infixExpr.charAt(i + 1)))
            {
                if (infixExpr.charAt(i) != '-' || infixExpr.charAt(i + 1) != '-')
                {
                    System.out.println("To many Operators.");
                    return false;
                }
            }
            else if (isOperator(infixExpr.charAt(i - 1)))
            {
                if (infixExpr.charAt(i) != '-' || infixExpr.charAt(i - 1) != '-')
                {
                    System.out.println("To many Operators.");
                    return false;
                }
            }
        }
        else if (isOperand(infixExpr.charAt(i)))
        {
            if (i == 0 || i == infixExpr.length())
            {
                out.append(infixExpr.charAt(i));
            }//THE LINE RIGHT BELOW THIS COMMENT THROWS THE ERROR!!!!!
            else if (isOperand(infixExpr.charAt(i + 1)) || isOperand(infixExpr.charAt(i - 1)))
            {
                System.out.println("Double digits and Postfix form are not accepted.");
                return false;
            }
        }
        else if (infixExpr.charAt(i) == 'q')
        {
            System.out.println("Your meow is now false. Good-bye.");
            System.exit(1);
        }
        else if(infixExpr.charAt(i) == '(' || infixExpr.charAt(i) == ')')
        {
            int p1 = 0;
            int p2 = 0;
            for (int p = 0; p<chars.length; p++)
            {
                if(infixExpr.charAt(p) == '(')
                {
                    p1++;
                }
                if(infixExpr.charAt(p) == ')')
                {
                    p2++;
                }
            }
            if(p1 != p2)
            {
                System.out.println("To many parentheses.");
                return false;
            }
        }
        else
        {
            System.out.println("You have entered an invalid character.");
            return false;
        }
        out.append(infixExpr.charAt(i));
    }
    return true;
}

private boolean isOperator(char val)
{
    return operators.indexOf(val) >= 0;
}

private boolean isOperand(char val)
{
    return operands.indexOf(val) >= 0;
}

メソッドを実行する私の主要部分:

    Boolean meow = true;
    while(meow)
    {
        System.out.print("Enter infix expression: ");
        infixExpr = scan.next();//THE LINE RIGHT BELOW THIS COMMENT THROWS THE ERROR!!!!!
        if(makePostfix.errorChecker(infixExpr) == true)
        {
            System.out.println("Converted expressions: "
                    + makePostfix.convert2Postfix(infixExpr));
            meow = false;
        }
    }

以前は正常に動作していましたが、以前は動作していた 1+2 を渡すことさえできず、どれも変更しませんでした。どうしたの!?!?

4

1 に答える 1

2

コード内でインデックス (i + 1) の文字を数回チェックしているように見えます。5 文字の長さの文字列を入力するとします。プログラムは通過し、次の行に到達します。

else if (isOperator(infixExpr.charAt(i + 1)) && isOperator(infixExpr.charAt(i - 1)))

i == 4 の場合、次のコードが発生します。

infixExpr.charAt(i + 1)

インデックスエラーをスローします。本質的には、長さが 5 文字の最大インデックス インデックス 4 を持つ文字列のインデックス 5 (6 番目の文字) の文字をチェックしています。また、あなたのチェック

if(i==0 || i == infixExpr.length)

そのままでは動作しません。(i==infixExpr.length-1) を確認してください。

于 2013-04-11T04:49:18.360 に答える