2011-03-25 153 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",而不是一個號碼的輸入線。但我不認爲忽略空值必然是正確的。

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

  • 難道他們表示丟失的數據點(緯度值)?
  • 它們是捕獲原始緯度數據的代碼中的一個錯誤的症狀嗎?
  • 它們是從輸入文件/數據庫中讀取數據的代碼中的錯誤的症狀嗎?

那麼也許你需要追蹤錯誤/錯誤或調整處理來處理丟失的數據。

相關問題