无法验证程序中的错误输入

时间:2014-11-19 09:04:53

标签: java validation

我已经为后缀计算器写了一个中缀。 只要中缀方程有效,它就能正常工作,但我无法弄清楚如何处理无效方程。

我的程序从由换行符分隔的文本文件中读取中缀方程式。它将转换后的后缀问题的结果打印到新的文本文件中。我试图让它如此,如果一个方程式无效,而不是打破程序它只是打印"无效"在输出页面上。我不知道该怎么办!

我的想法是在交换机列表中创建一个案例,提到"所有其他字符"不知何故,因为任何不是运算符或操作数的字符,但我根本无法工作,而且我很怀疑它是不可能的。

public class ExpressionTools extends ConsoleCalculator {
//for infix to postfix
static Stack s;
static String in;
private String out = "";

/**
 * expression tools
 * @param input
 */
public ExpressionTools(String input) {
    in = input; // input = inputed string
    s = new Stack<Character>(); // stack = stack of chars
}

/**
 * Determines string precedence
 * @throws PostFixException
 * @throws IOException
 */
public String precedence() throws PostFixException, IOException {
    // check for string precedence
    // for each character in the given string
    for (int i = 0; i < in.length(); i++) {
        char cha = in.charAt(i);
        switch (cha) {
        // if + or -
        case '+':
        case '-':
            operator(cha, 1);
            break;
        // First level of precedence
        // if * or /
        case '*':
        case '/':
            operator(cha, 2); // pop
            break;
        // second level of precedence
        case '(':
            s.push(cha); // if open paren, add to stack
            break;
        case ')':
            parentheses(cha); // pop operators
            break;
        default: 
            out = out + cha;
            break;// write to output string
        }
    }

    // while stack is not empty, add character to output
    while (!s.isEmpty()) {
        out = out + s.pop();
    }
    postfix.add(out);
    return out; // returns postfix expression
}   

/**
 * sets precedence of operators
 * 
 * @param oper
 * @param precedence1
 * @throws PostFixException
 * @throws IOException 
 */
public void operator(char oper, int precedence1) throws PostFixException, IOException {
    // while the stack is not empty
    // check precedence of operators
    while (!s.isEmpty()) {
        char head = (char) s.pop();
        if (head == '(') { // if bracket, push character
            s.push(head);
            break;
        } else {
            int precedence2;
            if (head == '+' || head == '-')
                precedence2 = 1;
            else
                precedence2 = 2;
            // if the precedence of the new operator
            // is less than the precedence of the old operator
            if (precedence2 < precedence1) {
                s.push(head); // push operator to stack
                break;
            }
            // if precedence not less, print to output
            else
                out = out + head;
        }
    }
    s.push(oper);
}

/**
 * if parentheses is open paren, ignore else print to output
 * 
 * @param c
 * @throws PostFixException
 * @throws IOException 
 */
public void parentheses(char c) throws PostFixException, IOException {      
    if(s.isEmpty()) out = "Invalid";

    while (!s.isEmpty()) {
        char a = (char) s.pop();
//      if(((Stack) s.peek()).isEmpty()){}
        if (a == '(')
            break;
        else
            out = out + a;
    }
}

我对此很失落!

修改 我已经尝试通过算法运行输入,该算法将其置于正确的格式(数字空间操作员空间编号等),这肯定解决了很多问题,但我认为问题的主要部分是使用堆栈更容易发现。

例如,在最后一个方法括号中,我尝试添加:

    if(s.isEmpty()) out = "Invalid";
但是由于某种原因,它不起作用,如果发生if语句,输出永远不会打印,而是我只是得到一个错误并且程序停止运行,我不知道为什么。

0 个答案:

没有答案