字符串方程式错误检查程序无效

时间:2013-04-11 04:20:02

标签: java error-handling calculator

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

此方法检查:

  • 多个圆括号
  • 超额运营商
  • 双位数
  • 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而且我改变了你所看到的。怎么了!?!?

1 个答案:

答案 0 :(得分:2)

看起来发生的事情是您在代码中多次检查索引(i + 1)处的字符。假设您输入一个长度为五个字符的字符串。该计划通过并到达该行:

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

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

infixExpr.charAt(i + 1)

抛出索引错误。 在essance中,您要检查字符串中索引为五(第六个字符)的字符,其最大索引索引为4,长度为5个字符。此外,您检查

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

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