java - 程序在线程“main”java.lang.NumberFormatException中得到错误异常:迭代数学表达式时
问题描述
当我尝试使用该函数迭代用户输入表达式时,我得到了java.lang.NumberFormatException
,我尝试修复循环很多时间,但我仍然不明白哪里出错了。parstInt
IDE 提示它在while 循环中出错
这是代码:
import java.util.Scanner;
import java.util.Stack;
static Stack<Integer> stackForOperand = new Stack<Integer>();
static Stack<Character> stackForOperator = new Stack<Character>();
public static int processOneOperator(char stackForOperator, int num1, int num2) {
int result = 0;
switch (stackForOperator) {
case '+':
result = num1 + num2;
case '-':
result = num1 - num2;
case '*':
result = num1 * num2;
case '/':
if (num2 != 0) {
result = num1 / num2;
} else {
throw new UnsupportedOperationException("divide by zero error");
}
}
return result;
}
public static boolean num_order(char first, char second) {
if (first == '(' || second == ')') {
return false;
} else if ((first == '*' || first == '/') && (second == '+' || second == '-')) {
return false;
} else {
return true;
}
}
public static int calculation_loop(String expression) {
for (int i = 0; i < expression.length(); i++) {
if (expression.charAt(i) >= '0' && expression.charAt(i) <= '9') {
String more_num = "";
while (i < expression.length() && expression.charAt(i) >= '0' && expression.charAt(i) <= '9') {
more_num += expression.charAt(i++);
int more_num2 = Integer.parseInt(more_num);
stackForOperand.push(more_num2);
i--;
}
} else if (expression.charAt(i) == '(') {
stackForOperator.push(expression.charAt(i));
} else if (expression.charAt(i) == ')') {
while (stackForOperator.peek() != '(') {
stackForOperand.push(
processOneOperator(stackForOperator.pop(), stackForOperand.pop(), stackForOperand.pop()));
stackForOperator.pop();
}
} else if (expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*'
|| expression.charAt(i) == '/') {
while (!stackForOperator.empty() && num_order(expression.charAt(i), stackForOperator.peek())) {
stackForOperand.push(
processOneOperator(stackForOperator.pop(), stackForOperand.pop(), stackForOperand.pop()));
stackForOperator.push(expression.charAt(i));
}
}
}
while (!stackForOperator.empty()) {
stackForOperand
.push(processOneOperator(stackForOperator.pop(), stackForOperand.pop(), stackForOperand.pop()));
}
return stackForOperand.pop();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("/");
String input = scanner.nextLine();
input = input.replaceAll("\\s+", "");
System.out.println(input);
Integer output = calculation_loop(input);
System.out.println(output);
}
}
解决方案
看这段代码:
public static int calculation_loop(String expression) {
for (int i = 0; i < expression.length(); i++) {
if (expression.charAt(i) >= '0' && expression.charAt(i) <= '9') {
String more_num = "";
while (i < expression.length() && expression.charAt(i) >= '0' && expression.charAt(i) <= '9') {
more_num += expression.charAt(i++);
int more_num2 = Integer.parseInt(more_num);
stackForOperand.push(more_num2);
i--;
}
所以。假设有这样的表达"2345+6789"
。根据您的代码i
,在 while 循环结束之前递增和递减。
while (i < expression.length() && expression.charAt(i) >= '0' && expression.charAt(i) <= '9') {
more_num += expression.charAt(i++);
...
i--;
}
这是你的意图吗?它使您的循环无限,并且仅因为解析时抛出数字格式异常而完成。这就是为什么我认为您的解析器会抛出异常:您首先获得数字,'2'
将其与 连接 ,然后more_num
增加无止境。首先你解析more_num,它是“2”,在下一次迭代中,你追加一个more_num“22”,然后是“222”......直到它变得比类型可以容纳的更大,如“22222222222222222222222”并抛出异常
第二件事。假设您删除i
i
'2'
more_num
'2'
int
i--
你的循环通常会迭代下一个字符。因此,您的 stackForOperand 将首先推送数字 2,然后推送数字 23,然后推送数字 234,然后推送数字 2345。这是您的意图吗?我认为更合乎逻辑的是在while循环之后Integer.parseInt
移动stackForOperand.push
public static int calculation_loop(String expression) {
for (int i = 0; i < expression.length(); i++) {
if (expression.charAt(i) >= '0' && expression.charAt(i) <= '9') {
String more_num = "";
while (i < expression.length() && expression.charAt(i) >= '0' && expression.charAt(i) <= '9') {
more_num += expression.charAt(i++);
}
int more_num2 = Integer.parseInt(more_num);
stackForOperand.push(more_num2);
推荐阅读
- html - 当屏幕仅通过 html / css 变窄时如何隐藏 div 块?
- html - 将 SVG 从另一个 svg 文件导入 HTML 文件
- haskell - 如何为具有三个参数的数据类型编写 Applicative 实例?
- javascript - 如何在 vue 中访问子组件中的值
- reactjs - 如何将标题换行到新行反应原生
- angular - Angular Default Currency Pipe 不与金额一起使用
- arduino - 通过firmata将Modelica与arduino连接起来
- scala - Akka (Scala) - 如何正确重置计时器/调度程序?
- python-3.x - 如何在谷歌分析 python api 中修复 oauth2client.client.HttpAccessTokenRefreshError
- postman - 通过(撇号无头)REST API 插入/更新片段及其字段