2012-06-22 15 views
7

sto ottenendo questo LogCat:test per gli oggetti JSON nulli 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) 

Ecco il codice:

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

Ecco il contesto:

In PHP, io sono calcolo della media dei numeri totali in una colonna in una tabella MySQL. Quando ci sono QUALSIASI riga, restituisce una media dei dati al suo interno e la codifica e Java la preleva come oggetto JSON. Ma a volte, ci sono casi in cui una tabella può avere 0 filari, in modo da ottenere questo JSON oggetto:

{"AverageRating":null} 

mia app si blocca allora e la LogCat è come visto sopra.

Il String non sembra importare se recupera un oggetto Null JSON ma l'app si arresta in modo anomalo quando eseguo Float.valueOf(theString).

Un'altra nota a margine, ho cercato di testare in questo modo:

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

Ma non fa mai sembra di leggere la stringa come nullo. In realtà non è in questo caso lo null?

risposta

25

utilizzare il seguente metodo di JsonObject per verificare se un valore contro qualsiasi chiave è nullo

public boolean isNull(java.lang.String key) 

Questo metodo viene utilizzato per controllare Null contro qualsiasi tasto o se non v'è alcun valore per la chiave.

utilizzare sotto frammento

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 Contento di aiutarti :) –

+0

Dopo un'ulteriore valutazione, sto spostando questa risposta a quella corretta. – KickingLettuce

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

parseFloat() un'eccezione se riceve null.

+2

1. non utilizzare le eccezioni per elaborare condizioni non eccezionali 2. non rilevare la classe di base 'Exception'. –

+0

Va bene, sono d'accordo con 2. Ma, non capisco 1. Perché? – nullpotent

+0

si tratta di un problema di progettazione. le eccezioni sono per condizioni eccezionali ... cose che non ti aspetti che succedano durante il normale funzionamento del codice. questa è solo una linea guida e spesso sei costretto a violarti con una scarsa progettazione dell'API. in questo caso, l'entità che genera il JSON deve aggiungere un numero (non una stringa, non un oggetto nullo) o lasciare il campo vuoto se il campo è facoltativo. –

0

controllo per nulla prima di analizzare il valore,

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

Detto questo, se il valore di AverageRating è in realtà un numero, quindi l'entità che sta generando il JSON non dovrebbe aggiungerlo alla JSON come una stringa. se non c'è valore per il campo, il campo dovrebbe essere assente. se c'è un valore per il campo, dovrebbe essere un numero.

se ciò fosse vero, si potrebbe gestire in questo modo,

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

altri posti hanno suggerito semplicemente cattura NumberFormatException. questo è corretto solo se si prevede di avere un doppio valore valido sul campo in ogni momento e considerarlo eccezionale in caso contrario. se sai/prevedi che il campo sarà a volte assente, non si qualifica come condizione eccezionale.

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

detto questo controllo valore nullo come tonalità valore JSON.

Problemi correlati