¿Cómo puedo obtener el número de línea donde se lanzó la excepción usando Thread.UncaughtExceptionHandler?

Cuando utilizo un bloque try-catch para obtener una excepción, puedo obtener el número de línea donde se lanzó la excepción llamando a e.getStackTrace() .

Me gusta esto:

 java.lang.NumberFormatException: Invalid int: "abc" java.lang.Integer.invalidInt(Integer.java:138) java.lang.Integer.parse(Integer.java:375) java.lang.Integer.parseInt(Integer.java:366) java.lang.Integer.parseInt(Integer.java:332) com.example.getarea.MainActivity.onCreate(MainActivity.java:42) android.app.Activity.performCreate(Activity.java:5066) android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102) android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) android.app.ActivityThread.access$600(ActivityThread.java:151) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1330) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:155) android.app.ActivityThread.main(ActivityThread.java:5536) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:511) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841) dalvik.system.NativeStart.main(Native Method) 

Pero cuando uso Thread.UncaughtExceptionHandler, llamar a e.getStackTrace() me da esto:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.getarea/com.example.getarea.MainActivity}: java.lang.NumberFormatException: Invalid int: "abc" android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332) android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) android.app.ActivityThread.access$600(ActivityThread.java:151) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1330) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:155) android.app.ActivityThread.main(ActivityThread.java:5536) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:511) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841) dalvik.system.NativeStart.main(Native Method) 

¿Cómo puedo obtener el número de línea donde se lanzó la excepción usando Thread.UncaughtExceptionHandler?

Tratar

 e.getStackTrace()[0].getLineNumber(); 

El primer elemento de la traza de pila es el método más recientemente llamado (la parte superior de la pila de llamadas).

También hay métodos para obtener la clase, método y nombre de archivo.

Si el e usted consigue en el UncaughtExceptionHandler no trabaja bien para usted (porque envuelve la excepción verdadera), usted puede intentar e.getCause() y mirar ese rastro de la pila.

Inspirado por Thilo y 范 植 勝 aquí la copia 'n la versión de pasta para la gente perezosa:

 public class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { final Thread.UncaughtExceptionHandler uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); @Override public void uncaughtException(Thread thread, Throwable throwable) { Log.ee(thread.getClass().getName(), throwable.getMessage(), "Error in " + Arrays.toString(throwable.getCause().getStackTrace())); if (uncaughtExceptionHandler != null) { // let Android know what happened uncaughtExceptionHandler.uncaughtException(thread, throwable); } else { // kill process System.exit(-1); } } } 

Nota: Log.ee es un creador de archivos personalizado

 public static void ee(String tag, String msg, String msg2) { try { String ts = Utils.getReadableTimeStamp(); File dir = new File(Environment.getExternalStorageDirectory() + "/" + Const.CRASH_DIR); dir.mkdirs(); PrintWriter printWriter = new PrintWriter(new FileWriter(new File(dir, "errors-" + sImei + ".log"), true)); printWriter.print("-------------------------------\r\n"); printWriter.print(ts + ":\r\n"); printWriter.print(tag + "\r\n"); printWriter.print(msg + "\r\n"); printWriter.print(msg2 + "\r\n"); printWriter.print("-------------------------------\r\n"); printWriter.flush(); } catch (IOException e) { android.util.Log.e(Log.class.getName(), "ee -> IOException", e); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.