2012-06-22 55 views
7

我得到這個logcat的:測試在Java/Android的空JSON對象

06-22 15:30:53.731: E/AndroidRuntime(2389): java.lang.NumberFormatException: Invalid float: "null" 
06-22 15:30:53.731: E/AndroidRuntime(2389):  at java.lang.StringToReal.invalidReal(StringToReal.java:63) 
06-22 15:30:53.731: E/AndroidRuntime(2389):  at java.lang.StringToReal.parseFloat(StringToReal.java:310) 
06-22 15:30:53.731: E/AndroidRuntime(2389):  at java.lang.Float.parseFloat(Float.java:300) 
06-22 15:30:53.731: E/AndroidRuntime(2389):  at java.lang.Float.valueOf(Float.java:337) 

這裏是代碼:

try 
{ 
    jObject = new JSONObject(result); 
    starAvg = jObject.getString("AverageRating"); 
} 
ratingsBar = (RatingBar) findViewById(R.id.theRatingBar); 
ratingsBar.setRating(Float.valueOf(starAvg)); 

這裏是上下文:

在PHP中,我對MySQL表中列中的總數進行平均。當有任何行時,它將發送一個平均數據並對其進行編碼,Java將其作爲JSON對象進行拾取。但有時,存在其中表可能有0行的情況下,所以我得到這個JSON對象:

{"AverageRating":null} 

我的應用程序,然後崩潰和LogCat如上所示。

String似乎並不關心它是否拾取了一個空JSON對象,但是當我執行Float.valueOf(theString)時該應用程序崩潰。

另一個方面說明,我已經試圖測試是這樣的:

if String is Null, Float = 0 
if String is not null, Float.valueOF(String) 

不過,這並不永遠似乎讀取的字符串爲空。在這種情況下它實際上不是null?如果收到null

回答

25

或使用JsonObject下面的方法來檢查是否對任意一個鍵值爲null

public boolean isNull(java.lang.String key) 

此方法用於檢查空對任何關鍵,如果有該鍵的值。下面

使用片斷

if (jsonObject.isNull("AverageRating")) { 
    Toast.makeText(this, "Cannot Convert!!", Toast.LENGTH_LONG).show(); 
    //float set to 0 
} else { 
    Float.valueOf(jsonObject.getString("AverageRating")); 
} 
+4

'Vipul.isGenius(Shah)? +1:null' – capdragon

+0

@capdragon很高興能幫到你:) –

+0

經過進一步評估,我將這個答案轉移到了正確的答案上。 – KickingLettuce

4
String str = jObject.getString("AverageRating"); 
float number = 0.f; 
try 
{ 
    number = Float.parseFloat(str); 
} 
catch (NumberFormatException e) 
{ 
    number = 0; 
} 

parseFloat()會拋出異常。

+2

1.不要使用異常來處理非例外條件2.不要捕獲基類「Exception」。 –

+0

好吧,我同意2.但是,我不明白1.爲什麼? – nullpotent

+0

這是一個設計問題。例外情況是針對特殊情況的......在代碼正常運行期間您不希望發生的事情。這只是一個指導原則,而且你通常被不良的API設計所侵犯。在這種情況下,生成JSON的實體應該添加一個數字(不是字符串,不是空對象),或者如果該字段是可選的,則將該字段留空。 –

0

檢查爲您解析值之前空,

String s = jObject.getString("AverageRating"); 
if (s != null) { 
    double rating = Double.parseDouble(s); 
    // whatever 
} 

這樣說,如果AverageRating值確實是一個數字,然後就是生成JSON不應該將它添加到JSON實體作爲一個字符串。如果該領域沒有價值,該領域應該缺席。如果這個領域有價值,那它應該是一個數字。

,如果這是真的,你可以處理它這個樣子,

if (jObject.has("AverageRating")) { 
    double rating = jObject.getDouble("AverageRating"); 
    // whatever 
} 

其他職位都建議只是追趕NumberFormatException。這隻有在你期望在任何時候都有一個有效的雙重價值並且認爲它是例外時纔是正確的。如果您知道/預計該領域有時不存在,則不符合特殊條件。

0
if (json != null && json.getString(KEY_SUCCESS) != null){ 
    // PARSE RESULT 
}else{ 
    // SHOW NOTIFICIATION: URL/SERVER NOT REACHABLE 
} 

他這樣說,檢查空值像鍵JSON值。