减法报错
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", ".", "="
};
该减号相较其他符号较大。
下图是经过反复更改的结果,恢复正常
时效性异常
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犯了病,遇到这样的问题,只能记录了。。。