warum ist nicht java.lang.Throwable eine abstrakte Klasse?
-
29-09-2019 - |
Frage
Mögliche doppelte: warum-ist-java-lang-throwable-a-Klasse
Hallo! Ich nicht verstehen, warum Throwable nicht abstrakte Klasse ist. Ich sehe nur ein Anwendungsfall für diese: in Systemen für die Abbildung aus Aufrufhierarchie anzumelden. Aber es kann einige statische Methode für diese oder andere Klasse sein. Also, warum?)
Danke.
upd
von java.util.logging.LogRecord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Warum kann es nicht Throwable.getStackTrace();
oder wie in java.lang.Thread sein
(new Exception()).getStackTrace();
Auf diese Weise können wir vermeiden throw new Throwable();
Upd2 von javadoc
Die Throwable Klasse ist die Super aller Fehler und Ausnahmen in der Java-Sprache.
So, als übergeordnete Klasse sollte es abstrakt sein, imho. Mit ihm für stacktrace bekommen ist nicht gut Fall unter diese Definition.
Lösung
ich nicht verstehen, warum Throwable nicht abstrakte Klasse ist.
Die Antwort ist eindeutig: hier angegeben.
Warum kann es nicht sein, Throwable.getStackTrace (); oder, wie in java.lang.Thread
Ganz einfach, ruft die getStackTrace()
die getOurStackTrace()
Methode, die nicht statisch ist. Wenn getStackTrace()
statisch war, sollte so getOurStackTrace()
. Dies wird nicht passieren, als printStackTrace()
Methode, um die getOurStackTrace()
verwendet. Dies ist in der JavaDoc erarbeitet:
Bietet programmatischen Zugriff auf die Stapelüberwachungsinformationen gedruckt von print ().
Quelle für java.lang.Throwable:
public StackTraceElement[] getStackTrace() {
return (StackTraceElement[]) getOurStackTrace().clone();
}
Auch, wenn Sie den Code getOurStackTrace()
Methode lesen, sehen Sie, es ruft die folgende Methode:
private native int getStackTraceDepth();
Soweit ich weiß, native
kann nicht statisch sein (ich kann falsch sein).
Andere Tipps
Ich verwende es oft für die Protokollierung, also bin ich froh, dass es nicht abstrakt ist. Es ist eine Methode, den Call-Stack zu bekommen, Thread.currentThread (). GetStackTrace (), aber diese liefert einen StackTraceElement [], die für die Protokollierung nicht sehr nützlich ist.
EDIT:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
. Hinweis: Diese Methode funktioniert auch einen Stack-Trace von einem anderen Thread zu erhalten, die sehr nützlich sein kann