2011-03-25 113 views
3

我解析doc和我得到以下错误:java.lang.NumberFormatException:对于输入字符串:“空”

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); 
    //} 
} 

正如你所看到的我试图检查“空”字符串,但即使取消注释第二个if语句我得到相同的错误。

感谢

+0

尝试在for循环中添加一个System.out.println(latValues [i] .trim()),可能由于间距问题而将null值作为latValues之一获取?并且可能只是在if语句之后打印出纬度 – Mike 2011-03-25 14:01:35

+0

回滚到修订1:由于删除的注释正在解决文本和答案(“...第二个if语句...”) – 2011-03-25 14:38:39

回答

11

可能的值之一是“空”(例如,字符串:"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语句,因为今天是“空”明天是其它东西(即双空格...)。

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

忘记关闭引用.equals(“null”) – Mike 2011-03-25 14:05:32

+0

要100%确定,应该是:'if(!latValues [i] .trim()。equals(“null”))' – 2011-03-25 14:06:22

+0

@Mike&Stephen C - 谢谢。 – MByD 2011-03-25 14:06:25

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) 

在另一个字,你有值不为空,但它包含单词“空” 。

如果你做Float.valueOf(null);,那实际上给你一个NullPointerException,这不是你在这里。

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); 
} 
0

的呼唤修剪功能是无用的。如果你真的想屏幕输入数据,以避免NumberFormatException的你会发现在JavaDocs for Doubles

1

代码这是很清楚的,问题是,你必须具有字符"null",而不是一个号码的输入线。但我不认为忽略空值必然是正确的。

首先,你需要找出那些空的真正含义是:

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

那么也许你需要追踪错误/错误或调整处理来处理丢失的数据。

相关问题