为什么我的解析Double函数不能正常工作呢?

时间:2016-01-27 18:59:27

标签: java parsing double

我正在尝试使用parse double函数来获取存储在字符串(velocityDirectionText)中的数字的值,它在大约50%的时间内工作,而另外50%它会给我这个错误:

Exception in thread "main" 
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at Code.Ball.getDataFromController(Ball.java:104)
at Code.Ball.updatePos(Ball.java:34)
at Code.BallManager.updateBalls(BallManager.java:23)
at Code.StartHere.main(StartHere.java:133)

这很奇怪,因为我在尝试解析之前有一个测试,测试它是否为空字符串,如果是,则将其设置为0.0。这就是逻辑:

    if(controller.velocityDirectionText.getText().equals(new String("")){
        controller.velocityDirectionText.setEditable(true);
        controller.velocityDirectionText.setText("0.0");
        controller.velocityDirectionText.setEditable(false);
    }
    System.out.println(controller.velocityDirectionText.getText());

即使它给我这个错误,这个打印调用也会打印出0.0。

我已经看到其他人在这个错误上发帖了,这是不同的,因为我打算输出字符串值,甚至在尝试解析它之前它仍然给我错误,即使它显然不是打印出一个空字符串。 这是我试图解析它的地方:

this.speedX = Double.parseDouble(controller.velocityMagnitudeText.getText()) * Math.cos(Math.toRadians(Double.parseDouble(controller.velocityDirectionText.getText())));

我无法弄清楚为什么它会给我这个错误,因为变量应该始终至少为0.0。这可能是parseDouble的一个已知问题吗?

我在下面的评论解释了我是如何提出这个解决方案的,但这里是我使用的新解析方法:

    private static double StringtoDouble(String s) {

    if(s.isEmpty()){
        return 0;
    }

    int length = s.length();
    boolean containsDecimal = false;
    int decimalPosition;
    double output = 0;

    // checking for a decimal place:
    if (s.contains(".")) {
        containsDecimal = true;
        decimalPosition = s.indexOf(".");
    } else
        decimalPosition = length;

    boolean decimalPassed = false;
    for (int i = 0; i < length; i++) {
        if ((int) s.charAt(i) != 46) {
            if (!decimalPassed) {
                output += asciiToInt((int) s.charAt(i)) * Math.pow(10, decimalPosition - i - 1);
            } else {
                output += asciiToInt((int) s.charAt(i)) * Math.pow(10, decimalPosition - i);
            }
        } else {
            decimalPassed = true;
        }
    }
    return output;
}

private static int asciiToInt(int a) {
    int[] integerAsciis = new int[10];
    for (int i = 0; i < 10; i++)
        integerAsciis[i] = 48 + i;
    for (int i = 0; i < 10; i++) {
        if (integerAsciis[i] == a) {
            return i;
        }
    }
    return 0;
}

0 个答案:

没有答案