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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top