Question

Possible en double: pourquoi-is-java-lang-throwable-a-classe

Salut! Je ne comprends pas pourquoi Throwable n'est pas classe abstraite. Je ne vois qu'un seul cas d'utilisation pour ces: dans les systèmes de journalisation pour la figure sur la hiérarchie des appels. Mais il peut être une méthode statique pour cette ou une autre classe. Alors, pourquoi?)

Merci.

UPD

de java.util.logging.LogRecord

// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();

Pourquoi il ne peut pas être Throwable.getStackTrace(); ou dans java.lang.Thread

(new Exception()).getStackTrace();

De cette façon, nous pouvons éviter throw new Throwable();

UPD2 de javadoc

  

La classe Throwable est la superclasse   de toutes les erreurs et exceptions dans la   Langage Java.

Alors, comme superclasse il devrait être abstraite, IMHO. Son utilisation pour obtenir stacktrace n'est pas bon cas par cette définition.

Était-ce utile?

La solution

  

Je ne comprends pas pourquoi Throwable   n'est pas classe abstraite.

La réponse est clairement indiqué .

  

Pourquoi il ne peut pas être   Throwable.getStackTrace (); ou en tant que   java.lang.Thread

Tout simplement, le getStackTrace() appelle la méthode getOurStackTrace() qui est non-statique. Si getStackTrace() était statique, devrait getOurStackTrace(). Cela ne se produira pas comme méthode printStackTrace() utilise le getOurStackTrace(). Ce point est développé dans le JavaDoc:

  

Fournit un accès programmatique au   les informations de trace pile imprimée par   printStackTrace ().

Source pour java.lang.Throwable:

 public StackTraceElement[] getStackTrace() {
        return (StackTraceElement[]) getOurStackTrace().clone();
    }

En outre, si vous lisez le code de la méthode de getOurStackTrace(), vous verrez qu'il appelle la méthode suivante:

private native int getStackTraceDepth();

Pour autant que je sache, native ne peut pas être statique (je peux me tromper).

Autres conseils

Je l'utilise assez souvent pour l'exploitation forestière, donc je suis content que ce n'est pas abstrait. Il y a une méthode pour obtenir la pile d'appel, Thread.currentThread (). GetStackTrace () mais ceci retourne un StackTraceElement [] qui est pas très utile pour l'enregistrement.

EDIT:

StackTraceElement[] stes = Thread.currentThread().getStackTrace();  

Note:. Cette méthode fonctionne également pour obtenir une trace de la pile d'un autre fil qui peut être pratique

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top