首页 > 解决方案 > 程序在线程“main”java.lang.NumberFormatException中得到错误异常:迭代数学表达式时

问题描述

当我尝试使用该函数迭代用户输入表达式时,我得到了java.lang.NumberFormatException,我尝试修复循环很多时间,但我仍然不明白哪里出错了。parstIntIDE 提示它在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);

}

}

标签: javastack

解决方案


看这段代码:

    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”并抛出异常 第二件事。假设您删除ii'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);

推荐阅读