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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top