java.lang.NumberFormatException:对于输入字符串:“null”

时间:2011-03-25 13:55:16

标签: java

我正在解析文档而我收到以下错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "null"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
    at java.lang.Float.valueOf(Float.java:388)
    at CentroidGenerator$Centroid.averageLat(CentroidGenerator.java:403)
    at CentroidGenerator.getCentroids(CentroidGenerator.java:30)
    at CentroidGenerator.main(CentroidGenerator.java:139)

这是抛出异常的代码的一部分:

if (latitude!=null) {
    //if (!latitude.equals("null")) {
        String[] latValues = latitude.split(" ");
    float sum = 0;
    for (int i = 0; i < latValues.length; i++) {                
        sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
    }
    latitude = Float.toString(sum / (float) latValues.length);
    //}
}   

正如您所看到的,我已经尝试检查“null”字符串,但即使取消注释第二个if语句,我也会得到相同的错误。

谢谢

6 个答案:

答案 0 :(得分:13)

也许其中一个值是“null”(例如,字符串:"123.4 null 5 null")而不是第一个,所以我认为一个合适的解决方案是:

String[] latValues = latitude.split(" ");
float sum = 0;
for (int i = 0; i < latValues.length; i++) {              
    if (!latValues[i].equals("null"))
        sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
}
latitude = Float.toString(sum / (float) latValues.length);

或者更确切地说,在for循环中添加try-cath并忽略非数字的值。

修改

正如评论中指出的那样(Sualeh),最好使用try / catch,因为今天它是“null”,明天就是其他东西(即双空格......)。

try {
sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
}
catch (NumberFormatException e)
{
// log e if you want...
}

答案 1 :(得分:1)

为避免像“1 2”这样的字符串出现问题,多个空格给出空值,最好在循环中添加try-catch,如下所示:

if (latitude != null) {
  String[] latValues = latitude.split(" ");
  float sum = 0;
  for (int i = 0; i < latValues.length; i++) {
    try {
      sum = sum + Float.valueOf(latValues[i].trim()).floatValue();
    } catch (NumberFormatException e) {
      e.printStackTrace();
    }
  }
  latitude = Float.toString(sum / (float) latValues.length);
}

答案 2 :(得分:1)

很明显,问题是您的输入行包含字符"null"而不是其中一个数字。但我不认为忽略空值必然是正确的做法。

首先,您需要弄清楚这些空值的真正含义:

  • 他们是否表示缺少数据点(纬度值)?
  • 它们是捕获原始纬度数据的代码中的错误的症状吗?
  • 它们是代码中从输入文件/数据库中读取数据的错误的症状吗?

然后,您可能需要追踪错误/错误或调整处理以处理丢失的数据。

答案 3 :(得分:0)

根据您的错误,您的latValues[i].trim()很可能会显示值“null”。我可以在这里复制你的问题: -

Float.valueOf("null");

这是堆栈跟踪: -

java.lang.NumberFormatException: For input string: "null"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1301)
    at java.lang.Float.valueOf(Float.java:375)

换句话说,你拥有的值不是null,而是包含单词“null”。

如果您执行Float.valueOf(null);,那实际上会为您提供NullPointerException,这不是您在此处所拥有的。

答案 4 :(得分:0)

调整功能的调用是没用的。如果你真的想要筛选你的输入数据以避免NumberFormatException,你可以找到JavaDocs for Doubles

中的代码

答案 5 :(得分:-1)

如果使用null,空格或空白字符串值传递,则parseInt()和parseDouble()会因NFE而出错。处理完null条件后,它仍然会失败并显示一个空字符串。尝试在空字符串之前添加一个零,如下所示。它还可以维护calc的完整性:

Integer.parseInt(“” .trim())

Integer.parseInt(“ 0” +“” .trim())