我正在尝试使用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;
}