2012-06-22 5 views
7

ich diesen LogCat bin immer:Prüfung auf null JSON-Objekte in Java/Android

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) 

Hier Code:

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

Hier ist der Kontext:

In PHP, ich bin Durchschnittszahlen in einer Spalte in einer MySQL-Tabelle. Wenn IRGENDEINE Zeilen vorhanden sind, sendet es einen Durchschnitt der darin enthaltenen Daten zurück und codiert es, und Java liest es als JSON-Objekt auf. Aber manchmal gibt es Fälle, in denen eine Tabelle 0 Zeilen haben kann, so dass ich dieses JSON-Objekt:

{"AverageRating":null} 

Meine App stürzt dann ab und die LogCat ist wie oben zu sehen.

Die String scheint nicht zu kümmern, wenn es ein Null JSON-Objekt abruft, aber die App stürzt ab, wenn ich Float.valueOf(theString) mache.

Eine andere Seite beachten, ich habe versucht, auf diese Weise zu testen:

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

Aber es scheint nicht immer die Zeichenfolge als null zu lesen. Ist es tatsächlich NICHT null in diesem Fall?

Antwort

25

die folgende Methode von JsonObject verwenden, wenn ein Wert gegen einen Schlüssel zu überprüfen null ist

public boolean isNull(java.lang.String key) 

Dieses Verfahren verwendet wird Null gegen jeden Schlüssel zu überprüfen, oder wenn es keinen Wert für den Schlüssel.

Verwenden unterhalb Schnipsel

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 Froh, Ihnen zu helfen :) –

+0

Nach weiterer Auswertung, verschiebe ich diese Antwort auf die richtige. – KickingLettuce

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

parseFloat() wird eine Ausnahme werfen, wenn es null erhält.

+2

1. Verwenden Sie keine Exceptions, um nichtausnahmebedingte Bedingungen zu verarbeiten. 2. Fangen Sie die Basisklasse Exception nicht ein. –

+0

In Ordnung, ich stimme mit 2. Aber ich verstehe nicht 1. Warum? – nullpotent

+0

ist es ein Design-Problem. Ausnahmen sind für außergewöhnliche Bedingungen ... Dinge, die Sie während des normalen Betriebs des Codes nicht erwarten. Dies ist nur eine Richtlinie, und Sie sind oft gezwungen, dies durch schlechte API-Design zu verletzen. In diesem Fall sollte die Entität, die JSON generiert, entweder eine Zahl (keine Zeichenfolge, kein Null-Objekt) hinzufügen oder das Feld leer lassen, wenn das Feld optional ist. –

0

Check für null, bevor Sie den Wert analysieren,

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

, dass gesagt wird, wenn der Wert von AverageRating wirklich eine Zahl ist, dann ist die Einheit, die die JSON generiert sollte es nicht zu dem JSON hinzufügen als eine Schnur. Wenn für das Feld kein Wert vorhanden ist, sollte das Feld nicht vorhanden sein. Wenn für das Feld ein Wert vorhanden ist, sollte es eine Zahl sein.

wenn das wahr wäre, man es so handhaben könnte,

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

anderen Beiträgen haben einfach NumberFormatException fangen vorgeschlagen. Dies ist nur dann richtig, wenn Sie zu jedem Zeitpunkt einen gültigen doppelten Wert im Feld erwarten und dies ansonsten als außergewöhnlich betrachten. Wenn Sie wissen/erwarten, dass das Feld manchmal abwesend sein wird, gilt es nicht als Ausnahmezustand.

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

, dass der Check-NULL-Wert wie Schlüssel als json Wert gesagt wird.