Wenn Sie für Android entwickeln, ist es viel einfacher, diese Methode zu verwenden:
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
Das Format ist das gleiche wie bei getStacktrace, z.B.
09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844): at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844): at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844): at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844): at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844): at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844): at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844): at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
8 Stimmen
Die Antwort von jqno verwendet nämlich die Methode Throwable.getStackTrace(), die Sie in Ihrer Frage angegeben haben, während Brian dies nicht tut. Er verwendet stattdessen Throwable.printStackTrace().
10 Stimmen
So gut wie jedes Java-Projekt sollte Apache commons-lang enthalten. Es enthält viele bequeme Methoden, die extrem häufige Entwicklungsanforderungen implementieren.
20 Stimmen
@StijndeWitt Diese drei Codezeilen müssen mit ziemlicher Sicherheit von der Stelle, an der Sie sie aufgerufen haben, ausgeklammert werden. Da Sie nicht wissen, wohin sie gehören, landen sie in Ihrer Utility-Toolbox mit all den anderen nützlichen Schnipseln. Bingo! Sie haben gerade Guava / Commons-Lang / was auch immer neu erfunden... nur nicht so gut. Importieren Sie stattdessen eine vernünftige Utility-Bibliothek und erfinden Sie das Rad nicht neu. Das wahre Zeichen eines Anfängers ist es, zu glauben, dass man es besser machen kann als die Autoren der Bibliothek.
2 Stimmen
NB: Das Prinzip der einzigen Abstraktionsebene ist der Grund dafür, dass diese Art von Dingen nicht berücksichtigt werden sollte. Erleichtert die Lesbarkeit und Testbarkeit, deckt wiederverwendbare Elemente auf. Siehe: slideshare.net/guestebde/10-ways-to-improve-your-code-
15 Stimmen
@AndrewSpencer Ich verstehe nicht, warum ihr so sehr versucht, StijndeWitt dafür zu beschimpfen, dass er dies mit einem kleinen Schnipsel erreichen will. Es besteht wirklich keine große Gefahr, eine winzige Utility-Methode zu schreiben (ich sehe es nicht als "Reine ARROGANZ, oh nein, er denkt, er sei besser als Apache"). Es gibt tonnenweise Projekte, vor allem in Nicht-Java-JVM-Sprachen, die wirklich nicht Guava oder Commons Lang einbinden wollen, nur um einen Stacktrace zu protokollieren. Ich schreibe Scala- und Clojure-Bibliotheken und werde sicherlich nicht Apache Commons Lang zu einer transitiven Abhängigkeit nur für eine Methode machen.
1 Stimmen
@jm0 Kein Bashing, nur eine qualifizierte Meinungsverschiedenheit. Es war ein bisschen zu schnippisch, ich war auf einen Kampf aus, nachdem ich einige schlechte selbstgebaute Dienstprogramme gesehen hatte. Ich stimme zu, dass es Gründe gibt, eine Abhängigkeit nicht hinzuzufügen, ich sehe nur häufiger den gegenteiligen Fehler.
0 Stimmen
@Gewure Unser Wissen und unser Verständnis des Codes sind heute so viel weiter entwickelt und fortgeschritten. Wir brauchen solche belanglosen Fragen nicht mehr. Lasst das gemeine Volk in seinen Unzulänglichkeiten verrotten.
0 Stimmen
Ich bin hierher gekommen, weil man beim Schreiben von Amazon Lambda-Funktionen in Java den Import von Bibliotheken vermeiden sollte, da sie die Startzeit des Containers in die Höhe treiben. Manchmal ist es also notwendig, das Rad neu zu erfinden. Oder vielleicht könnte ich das mit ProGuard lösen...
0 Stimmen
@Andrew ich weiß nicht, ob ich deinen Sarkasmus? richtig interpretiere, aber ich denke, du hast mich auch nicht richtig interpretiert: Ich wollte sagen, dass SO ein Problem hat. Es ist in der Tat elitär geworden. Es versagt völlig dabei, eine Verbindung für Neulinge zu öffnen. Sie wollten z.B. kein nicht-englisches SO. Das ist undemokratisch und elitär. Es gibt Leute, die programmieren können/wollen, aber kein richtiges Englisch sprechen.
1 Stimmen
@Gewure Es wäre hilfreich gewesen, wenn du deinen Kommentar nicht gelöscht hättest... Es war aber offensichtlich Sarkasmus. S.O. war schon immer voll von elitären und engstirnigen Snobs. Das ist nicht wirklich die Schuld von S.O., denke ich, sondern nur ein allgemeiner Fehler der Menschheit, der hier sehr deutlich zur Schau gestellt wird. Was die englische Sprache betrifft, so gibt es auf beiden Seiten eine gewisse Sensibilität; ich kann allerdings nur über das Argument selbst sprechen.
3 Stimmen
Verwenden Sie commons-lang. Josh Bloch sagt: "Wenn Sie etwas tun müssen, das relativ häufig vorkommt, gibt es vielleicht schon eine Klasse in den Bibliotheken, die das tut, was Sie wollen. Wenn das der Fall ist, verwenden Sie sie; wenn Sie es nicht wissen, überprüfen Sie es.[...]Bibliothekscode ist wahrscheinlich besser als Code, den Sie selbst schreiben würden, und wird wahrscheinlich im Laufe der Zeit verbessert.Das ist keine Aussage über Ihre Fähigkeiten als Programmierer.Skaleneffekte diktieren, dass Bibliothekscode weit mehr Aufmerksamkeit erhält, als die meisten Entwickler es sich leisten könnten, der gleichen Funktionalität zu widmen."