0

我有一种方法可以检查写出的方程式是否正确。

此方法检查:

  • 多括号
  • 多余的运算符
  • 两位数
  • q的
  • 以及字符串中的任何字符,而不是这些字符:

.

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) 处的字符。假设您输入了一个长度为五个字符的字符串。该程序通过并到达该行:

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

如果 i == 4,这将导致代码:

infixExpr.charAt(i + 1)

抛出索引错误。本质上,您正在检查字符串中索引为 5(第六个字符)的字符,该字符串的最大索引索引为 4,即长度为 5 个字符。此外,您的检查

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

不会按原样工作。也许检查 (i==infixExpr.length-1)。

于 2013-04-11T04:49:18.360 回答