我有这个表达式,例如:
400 2.11 +
我尝试将实数推入堆栈,当我这样做时,它在这部分代码中显示错误
ch = input.charAt(j);
if (ch >= '0' && ch <= '9' || ch == '.')
temp = temp + ch;
else if (ch == ' ') {
x = Double.parseDouble(temp);
theStack.push(x);
temp = "";
}
else {
...
public void push(double j) {
stackArray[++top] = j;
}
这是消息
Exception in thread "main" java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011)
at java.lang.Double.parseDouble(Double.java:540)
at ParsePost.doParse(ParsePost.java:26)
at InfixApp.main(InfixApp.java:21)
答案 0 :(得分:1)
这是关于空字符串的错误,在错误中明确提到。这里'temp'变量的值是空的。Double.parseDouble(temp)
无法解析空String.So它抛出异常为了使它工作,你必须给一个String形式的浮点数,这个浮点数对于这个函数可以是Parseable。
答案 1 :(得分:1)
如果你知道数字之间的分隔字符,也许你可以使用split(String regex)
函数。
在这种情况下,一旦您指定了分隔字符,您的职责是检查String[]
返回的split
并找到算术符号。
我写了这个简单的类来测试我说的话:
import java.util.ArrayList;
public class StringParsing {
public static void main(String[] args) {
//Simple string to split
String str = "444 6.12 +";
String[] values = str.split(" ");
ArrayList<Double> arr = new ArrayList<Double>();
for(int i = 0; i < values.length; i++) {
//I check only for +
if(!values[i].contains("+")) {
Double d = Double.parseDouble(values[i]);
arr.add(d);
}
}
for(int i = 0; i < arr.size(); i++)
//Add 1 to number for verify the correctness
System.out.println("Double: "+(arr.get(i)+1.0));
}
}
答案 2 :(得分:0)
我认为你出错了。我认为临时是空的..
if(temp.trim().length()>0){
x = Double.parseDouble(temp);
theStack.push(x);
}
答案 3 :(得分:0)
ch = input.charAt(j);
if (ch >= '0' && ch <= '9' || ch == '.')
temp = temp + ch;
else if (ch == ' ') {
if (null != temp && temp.trim().length()>0) {
x = Double.parseDouble(temp.trim());
}
else
{
//Case where string is empty
}
theStack.push(x);
temp = "";
}
试试这个希望它有所帮助。
答案 4 :(得分:0)
我已经通过正确的初始化测试了你的代码,并推送了确切的输入字符串,它工作正常,但我添加了一个FOR循环。
就像上面的建议一样,问题是你正在尝试将空字符串转换为double。
double x = Double.parseDouble(temp);