将String转换为Double并将其放入堆栈

时间:2013-03-22 04:06:42

标签: java

我有这个表达式,例如: 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)

5 个答案:

答案 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);