pourquoi ne pas java.lang.Throwable une classe abstraite?
-
29-09-2019 - |
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.
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