2012-02-09 3 views
2

Когда я разрабатываю приложение для Android, я хочу создать класс CrashReport, а затем использовать его для отправки отчета на мой сервер.О java Throwable

Я делаю класс под названием CrashHandler которые реализуют UncaughtExceptionHandler и сделать пример, чтобы вызвать ошибку NullPoint в деятельности в целях, класс работает хорошо, но небольшая проблема ... в методе uncaughtException:

@Override 
    public void uncaughtException(Thread thread, Throwable ex) { 
     ex.printStackTrace(); //**code line 1** 

     ....//some other codes and variables 

     StackTraceElement[] elements = ex.getStackTrace(); 
     for (StackTraceElement element : elements) {  // **code line 2** 
      errorString = errorString + "<br/>" + element.toString(); 
    } 
    } 

строка кода 1 печать трассировки стека как:

java.lang.NullPointerException 

my.app.ExceptionCaughtActivity$1.onClick(ExceptionCaughtActivity.java:25) 
android.view.View.performClick(View.java:2486) 
android.view.View$PerformClick.run(View.java:9130) 
android.os.Handler.handleCallback(Handler.java:587) 
android.os.Handler.dispatchMessage(Handler.java:92) 
android.os.Looper.loop(Looper.java:130) 
android.app.ActivityThread.main(ActivityThread.java:3703) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:507) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
dalvik.system.NativeStart.main(Native Method) 

но codeline только шоу:

my.app.ExceptionCaughtActivity$1.onClick(ExceptionCaughtActivity.java:25) 
android.view.View.performClick(View.java:2486) 
android.view.View$PerformClick.run(View.java:9130) 
android.os.Handler.handleCallback(Handler.java:587) 
android.os.Handler.dispatchMessage(Handler.java:92) 
android.os.Looper.loop(Looper.java:130) 
android.app.ActivityThread.main(ActivityThread.java:3703) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:507) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
dalvik.system.NativeStart.main(Native Method) 

вы заметили, что не показали:

"java.lang.NullPointerException" 

Я konw Я не назвал getCause() , но при попытке использовать getCause(), она возвращает нуль, не Throwable;

Я попытался просмотреть исходный код метательного класса ... но получил отметить

вы можете мне сказать, почему getCause является недействительным, но printStackTrace имеют причину ошибки, чтобы распечатать ??

ответ

0

getCause() возвращает null, если throwable находится в верхней части цепочки исключений. Это причина, поэтому у нее не может быть причины.

Вы можете узнать о цепочке исключений here.

+0

Ах, вот оно что. – daimajia

+0

, но как я могу получить текущую причину ошибки другими способами? – daimajia

+0

Проверьте, является ли причина нулевой? Если нет, то это имеет причину. – Jivings

1

ex.printStackTrace() услужливо печатает класса и сообщение (если таковые имеются) из объекта Throwable ex, а также информацию трассировки. См. Throwable.toString().

Исходная трассировка стека не включает эту информацию, но вы можете получить ее из объекта Throwable, который может иметь или не иметь сообщение, и может иметь или не иметь причины. Хотя у него всегда есть класс! ;-)

Вот исходный код из Throwable:

public void printStackTrace(PrintStream s) { 
    synchronized (s) { 
     s.println(this); 
     StackTraceElement[] trace = getOurStackTrace(); 
     for (int i=0; i < trace.length; i++) 
      s.println("\tat " + trace[i]); 

     Throwable ourCause = getCause(); 
     if (ourCause != null) 
      ourCause.printStackTraceAsCause(s, trace); 
    } 
} 
0

Первая линия получает от этого:

public String toString() { 
    String s = getClass().getName(); 
    String message = getLocalizedMessage(); 
    return (message != null) ? (s + ": " + message) : s; 
} 

Так что, если вы хотите добавить первое использование строки:

errorString += ex.toString + "<br/>"; 
StackTraceElement[] elements = ex.getStackTrace(); 
for (StackTraceElement element : elements) {  // **code line 2** 
    errorString = errorString + "<br/>" + element.toString(); 
} 
+0

вы правы !!! Я получил первую строку. – daimajia

+0

public Throwable (Throwable cause) { fillInStackTrace(); detailMessage = (причина == null? Null: cause.toString()); this.cause = cause; } this.cause = cause; но почему ex.getCause() имеет значение null ????? – daimajia

+0

Как вы попадаете? new Throwable (null), например, создаст нулевую причину. – kornero