我在尝试评估字符串时遇到问题。我的评估方法是正确的,所以我不打算分享,但我似乎无法让方法真正达到评估的目的。我一直在尝试所有事情,似乎我要么得到对象引用,要么它需要标识符,或者不同类型(静态与非静态)。
我想要的是知道如何使方法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();
}
}
答案 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+");
以确保该字符串不包含额外的前导和尾随空格。