java计算器遇到的问题

减法报错

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "9−3"

可以保证程序没有没有任何的错误。搞了半天,在通过更改按钮符号来排查错误时终于发现了异常。如下图:

		JButton[] standredButton = new JButton[24];
        String str[] = {"%", "1/x", "C", "⊗",
                "x²", "x³", "√x", "÷",
                "7", "8", "9", "×",
                "4", "5", "6", "-",
                "1", "2", "3", "+",
                "±", "0", ".", "="
        };

java计算器遇到的问题_第1张图片
该减号相较其他符号较大。
下图是经过反复更改的结果,恢复正常
java计算器遇到的问题_第2张图片

时效性异常

public BigDecimal evaluateExpression(String expression) {
        Stack<Double> operandStack = new Stack<>();
        Stack<Character> operatorStack = new Stack<>();
        expression = insetBlanks(expression);
        String[] tokens = expression.split(" ");
        for (String token : tokens) {
            //如果是空格的话就继续循环,什么也不操作
            if (token.length() == 0) {
                continue;
            }
            //如果是加减的话,因为加减的优先级最低,因此这里的只要遇到加减号,无论操作符栈中的是什么运算符都要运算
            if (token.charAt(0) == '+' || token.charAt(0) == '-') {
                //当栈不是空的,并且栈中最上面的一个元素是加减乘除取余中的任意一个
                while (!operatorStack.isEmpty() && (operatorStack.peek() == '+' || operatorStack.peek() == '-' ||
                        operatorStack.peek() == '÷' || operatorStack.peek() == '×' || operatorStack.peek() == '%')) {
                    //开始运算
                    processAnOperator(operandStack, operatorStack);
                }
                //运算完之后将当前的运算符入栈
                operatorStack.push(token.charAt(0));
            }
            //当前运算符是乘除取余的时候,因为优先级高于加减,因此要判断最上面的是否是乘除取余,如果是乘除取余就运算,否则的话直接入栈
            else if (token.charAt(0) == '×' || token.charAt(0) == '÷' || token.charAt(0) == '%') {
                while (!operatorStack.isEmpty() && (operatorStack.peek() == '÷' ||
                        operatorStack.peek() == '×' || operatorStack.peek() == '%')) {
                    processAnOperator(operandStack, operatorStack);
                }
                //将当前操作符入栈
                operatorStack.push(token.charAt(0));
            } else {
                //将数字字符串转换成数字然后压入栈中
                operandStack.push(Double.parseDouble(token));
            }
        }
        //最后当栈中不是空的时候继续运算,直到栈中为空即可
        while (!operatorStack.isEmpty()) {
            processAnOperator(operandStack, operatorStack);
        }
        //此时数据栈中的数据就是运算的结果
        return BigDecimal.valueOf(operandStack.pop()).setScale(2, RoundingMode.UP);
    }

    /**
     * TODO:这个方法的作用就是处理栈中的两个数据,然后将栈中的两个数据运算之后将结果存储在栈中
     *
     * @author gky
     * @date 2023/3/12
     */
    public void processAnOperator(Stack<Double> operandStack, Stack<Character> operatorStack) {
        //弹出一个操作符
        char op = operatorStack.pop();
        //从存储数据的栈中弹出连个两个数用来和操作符op运算
        Double op1 = operandStack.pop();
        Double op2 = operandStack.pop();
        //如果操作符为+就执行加运算
        if (op == '+') {
            result = op1 + op2;
        } else if (op == '-') {
            //因为这个是栈的结构,自然是上面的数字是后面的,因此用op2-op1
            result = op2 - op1;
        } else if (op == '×') {
            result = op1 * op2;
        } else if (op == '÷') {
            if (op1 == 0) {
                result = op2;
                System.out.println("服了。。");
            } else {
                result = op2 / op1;
            }
        } else if (op == '%') {
            if (op1 == 0) {
                result = op2;
                System.out.println("服了。。");
            } else {
                result = op2 % op1;
            }
        }
        operandStack.push(result);
    }

在改动这部分代码时,发现改了和没改的效果一样。我暂时无法解决

结论

终究是idea犯了病,遇到这样的问题,只能记录了。。。

你可能感兴趣的:(生活琐碎,java,jvm,servlet)