perché non è java.lang.Throwable una classe astratta?
-
29-09-2019 - |
Domanda
Eventuali duplicati: perché-è-java-lang-throwable-a-class
Ciao! I non capisco perché non è Throwable classe astratta. Vedo solo un caso d'uso per questi: nei sistemi di registrazione per figura fuori gerarchia di richiamo. Ma può essere un metodo statico per questo o altra classe. Quindi, perché?)
Grazie.
UPD
da java.util.logging.LogRecord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
Perché non può essere Throwable.getStackTrace();
o come nel java.lang.Thread
(new Exception()).getStackTrace();
In questo modo possiamo evitare throw new Throwable();
UPD2 da javadoc
La classe Throwable è la superclasse di tutti gli errori e le eccezioni nel Java la lingua.
Così, come una superclasse dovrebbe essere astratto, imho. Usandolo per ottenere stacktrace non è buono, caso per questa definizione.
Soluzione
I non capisce il motivo per cui Throwable non è classe astratta.
La risposta è chiaramente indicato qui .
Perché non può essere Throwable.getStackTrace (); o come in java.lang.Thread
Semplicemente, la getStackTrace()
chiama il metodo getOurStackTrace()
che è non-statico. Se getStackTrace()
era statica, così dovrebbe getOurStackTrace()
. Questo non accadrà come metodo di printStackTrace()
utilizza il getOurStackTrace()
. Questo è elaborato nel JavaDoc:
Fornisce l'accesso programmatico al Informazioni traccia dello stack stampato da printStackTrace ().
Fonte per java.lang.Throwable:
public StackTraceElement[] getStackTrace() {
return (StackTraceElement[]) getOurStackTrace().clone();
}
Inoltre, se si legge il codice del metodo di getOurStackTrace()
, vedrete che chiama il seguente metodo:
private native int getStackTraceDepth();
Per quanto ne so, native
non può essere statico (potrei sbagliarmi).
Altri suggerimenti
Io lo uso molto spesso per la registrazione, quindi sono contento che non è astratta. C'è un metodo per ottenere lo stack di chiamate, Thread.currentThread (). GetStackTrace (), ma questo restituisce uno StackTraceElement [] che non è molto utile per la registrazione.
EDIT:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
. Nota: questo metodo funziona anche per ottenere una traccia dello stack di un altro thread che può essere utile