2012-06-22 12 views
7

Estoy consiguiendo este LogCat:Pruebas de objetos JSON nulos en 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) 

Aquí es código:

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

Aquí está el contexto:

En PHP, yo soy promediar números totales en una columna en una tabla MySQL. Cuando hay CUALQUIER fila, enviará un promedio de los datos en ella y la codificará, y Java la recogerá como un objeto JSON. Pero a veces, hay casos en que una tabla puede tener 0 filas, por lo que obtener este JSON del objeto:

{"AverageRating":null} 

Mi aplicación a continuación, los accidentes y la LogCat es como se ha visto anteriormente.

El String no parece importarle si capta un Objeto JSON nulo, pero la aplicación se bloquea cuando lo hago Float.valueOf(theString).

Otra nota al margen, me han tratado de probar de esta manera:

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

Pero no parece nunca para leer la cadena como nula. ¿En realidad NO es null en este caso?

Respuesta

25

utilizar el siguiente método de JsonObject para comprobar si un valor en contra de cualquier clave es nula

public boolean isNull(java.lang.String key) 

Este método se utiliza para comprobar Null contra cualquier tecla o si no hay valor de la clave.

Uso continuación fragmento de código

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: nulo' – capdragon

+0

@capdragon Me complace ayudarte :) –

+0

Tras una evaluación posterior, muevo esta respuesta a la correcta. – KickingLettuce

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

parseFloat() lanzará una excepción si recibe null.

+2

1. no use excepciones para procesar condiciones no excepcionales 2. no capture la clase base 'Excepción'. –

+0

De acuerdo, estoy de acuerdo con 2. Pero, no entiendo 1. ¿Por qué? – nullpotent

+0

es un problema de diseño. las excepciones son por condiciones excepcionales ... cosas que no espera que sucedan durante el funcionamiento normal del código. esto es solo una guía, y a menudo se ve obligado a violar esto por un diseño API pobre. en este caso, la entidad que genera el JSON debe agregar un número (no una cadena, no un objeto nulo), o dejar el campo en blanco si el campo es opcional. –

0

comprobar NULL antes de analizar el valor,

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

eso se dice, si el valor de AverageRating es realmente un número, entonces la entidad que está generando el JSON no debe añadirlo a la JSON como una cadena. si no hay ningún valor para el campo, el campo debe estar ausente. si hay un valor para el campo, debe ser un número.

si eso fuera cierto, se podía manejar la situación como esta,

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

otros mensajes han sugerido simplemente coger NumberFormatException. esto solo es correcto si espera tener un valor doble válido en el campo en todo momento y lo considera excepcional de lo contrario. Si sabe/espera que el campo algunas veces falte, no califica como una condición excepcional.

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

una vez dicho cheque valor nulo como valor fundamental como JSON.

Cuestiones relacionadas