如何使用Eval方法

时间:2015-03-31 06:04:54

标签: java testing methods

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

我想要的是知道如何使方法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();
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案:添加.trim()或者你的字符串为空,然后再添加另一个.trim(),否则答案将为0.0。

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

答案 1 :(得分:0)

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

  

异常:java.lang.NumberFormatException(空字符串)

这来自以下一行:

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

传递给parseDouble()的值应该是表示数字的字符串,但事实并非如此。它是空字符串,如错误消息所示。

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

[, 3, 4, +]
因此,它在开头包含一个空字符串,由表达式中的额外前导空格引起。

将其替换为"3 4 +",或致电expr.trim().split("\\s+");以确保该字符串不包含额外的前导和尾随空格。