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

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

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) 

这是抛出exception的代码的一部分:

 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语句,我也会得到相同的错误。

谢谢

也许其中一个值是“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... } 

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

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

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

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

为了避免像“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); } 

根据您的错误,您的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 ,这不是你在这里。

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