如何使用评估方法

How to Use Eval Method

我在尝试对字符串求值时遇到问题。我的评估方法是正确的,所以我不打算分享它,但我似乎无法让方法真正达到评估的目的。我一直在尝试所有的事情,似乎我正在获取对象引用,或者它想要的标识符,或者不同的类型(静态与非静态)。

我想知道如何让 eval() 方法起作用。

无论如何,这是代码:

import java.util.Stack;

public class Postfix
{
    String expr;

    public Postfix(String e)
    {
        expr = e;
    }

    public double eval()
    {
        Stack<Double> stack = new Stack<Double>();
        String[] word = expr.split("\s+");
        for (int i = 0; i < word.length; i++)
        {
            double a, b, c;
            switch(word[i])
            {
                case "+":
                    b = stack.pop();
                    a = stack.pop();
                    stack.push(a + b);
                    break;
                default:
                    stack.push(Double.parseDouble(word[i]));
                    break;
            }
        }
        return stack.peek();
    }
}

规则 #1:如果您的代码不起作用,请不要执行我所做的操作,也不要粘贴它。

答案:添加 .trim() 否则您的字符串将为空然后再次添加另一个 .trim() 否则答案将为 0.0.

String[] word = expr.trim().trim().split("\s+");

好的,您仍然没有 post 异常的堆栈跟踪,尽管这是您的调查应该始终开始的地方,因为它告诉了问题是什么以及它发生的位置。不过,我们有异常消息,我可以从代码中猜出它来自哪里:

Exception: java.lang.NumberFormatException (empty String)

这来自以下行:

stack.push(Double.parseDouble(word[i]));

传递给 parseDouble() 的值应该是一个表示数字的字符串,但它不是。如错误消息所述,它是空字符串。

为什么?使用调试器会很容易地发现问题。您将以下字符串 " 3 4 + " 传递给 expr.split("\s+")。结果是以下数组(您也可以通过使用 System.out.println(Arrays.toString(word)) 打印它来了解):

[, 3, 4, +]

因此它在开头包含一个空字符串,这是由表达式中的额外前导 space 引起的。

将其替换为 "3 4 +",或调用 expr.trim().split("\s+"); 以确保字符串不包含额外的前导和尾随白色 spaces。