2011-07-26 18 views
14

Tengo un problema con Android. Desarrollo en dispositivo y tengo problemas para detectar excepciones. Estoy corriendo un cierto código en AsyncTask y finalmente simplificado a:try catch exception siempre devuelve nulo

try 
{ 
    if (true) 
     throw new Exception("ERROR"); 
}  
catch (Exception e) 
{  
    Log.e("e", "exception", e); 
} 

Mi problema es que 'e' variable es siempre nula. No estoy seguro de lo que está pasando en realidad. Además, a veces funciona, pero no puedo decir cuándo. Me levanto de la computadora por unos minutos y luego, boom, funciona. Hacer la codificación unos minutos y nuevamente es nulo ... Hubo una pregunta en SO hace aproximadamente 1 año, pero ninguna respuesta conocida. Quizás esta vez alguien tenga una idea.

Null exception

creo que tiene algo que ver con AsyncTask como fuera de ella, me catched excepción adecuadamente ... todavía no tienen ninguna idea de por qué :(He encontrado que sólo ocurre cuando es Debbuger conectado. Cuando saco el cable del dispositivo, realmente atrapa y la excepción ya no es nula ...

+0

¿Estás creando instancias de AsyncTask en el hilo de la interfaz de usuario? ¿Estás invocando la ejecución (Params ...) en el hilo de UI? ¿Está llamando onPreExecute(), onPostExecute (Result), doInBackground (Params ...), onProgressUpdate (Progress ...) manualmente? ¿Te llaman la tarea más de una vez? –

+0

Una instancia, no hay llamadas manuales a * métodos. Invocándolo con execute (params) en el hilo de UI. Creo que voy a pasar ese caso ... es que otras personas lo están trabajando así que me quedaré por ahora con el desarrollo en mi vm linux box heh – mariozski

+0

¡Decisión sabia! Si funciona en el teléfono celular, no hay problema. –

Respuesta

4

Es imposible tener e con valor nulo en ese punto. Si está depurando su aplicación usando Eclipse, se mostrará el valor e.toString() en ese punto y el e.toString() está devolviendo null.

Pruebe otra prueba, utilizando este código:

try { 
    if (true) { 
     throw new Exception("ERROR"); 
    } 
}  
catch (Exception e) { 
    if (e == null) { 
     Log.e("e", "e is really null!!!"); 
    } 
    else { 
     Log.e("e", "e is not null, toString is " + e + " and message is " + e.getMessage()); 
    } 
} 
+4

Creo que no entiendes ... la variable e es nula ... no puedes ejecutar el método porque obtendrás NullPointerException. Aparte de ese 3er parámetro de Log.e es Throwable not String ... – mariozski

+1

¿Lo intentó? –

+0

Bueno, lo intenté pero no pude compilar el proyecto :) "El método e (String, String, Throwable) en el tipo Log no es aplicable para los argumentos (String, String, String)" – mariozski

1

que tenían exactamente el mismo problema extraño dentro de un AsyncTask, mientras se depura en un dispositivo real (Galaxy Tab 2). (Y sí, obtuve "e is really null!!!" haciendo la prueba sugerida por @italo)

Para mí, el problema desapareció misteriosamente después de desenchufar el conector usb del dispositivo Android y volver a conectarlo luego (y luego volver a ejecutar mi aplicación).

Otra sugerencia, limpiar y reconstruir el proyecto, como se explica here no lo resolvió para mí (pero tal vez para otra persona).

2

Sé que esta es una vieja pregunta, pero esto también me sucedió a mí, ¡y parece que el problema está en el depurador mismo!
Cuando ejecuto mi aplicación desde Eclipse (ctrl +F11), atrapa una excepción adecuada (e != null).

+0

Exactamente. Por supuesto, es el depurador. No puede ser otra cosa. Las excepciones funcionan – EJP

2

Tuve el mismo problema ... Descubrí que era el depurador como las otras personas habían dicho. Entonces, lo que hice para depurar fue simplemente poner el punto de quiebre en la primera línea del bloque catch, en lugar de ponerlo justo en el bloque catch. ¡Pareció funcionar para mí!

+1

Lo más extraño, nunca lo había visto antes. Probé todas las recomendaciones en esta página, un par de veces, pero ninguna funcionó. finalmente, después de hacerlos cada uno unas cuantas veces, este finalmente tuvo éxito y llenó la excepción sin razón aparente. Supongo que tiene que ser persistente – JCricket

+0

Tenía el mismo problema y esto lo solucionó. Esta debería ser la respuesta aceptada. Y este error debe ser reportado a JetBrains IntelliJ. – John