¿por qué no es java.lang.Throwable una clase abstracta?
-
29-09-2019 - |
Pregunta
Posible duplicado: qué-es-java-lang-throwable-a-clase
Hola! Yo no entiendo por qué no es Throwable clase abstracta. Sólo veo un caso de uso de éstos: en el registro de sistemas para averiguar jerarquía de llamadas. Pero puede haber algún método estático para esta u otra clase. Así que, ¿por qué?)
Gracias.
UPD
desde java.util.logging.LogRecord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
¿Por qué no puede ser Throwable.getStackTrace();
o como en java.lang.Thread
(new Exception()).getStackTrace();
De esta manera podemos evitar throw new Throwable();
UPD2 de javadoc
La clase Throwable es la superclase de todos los errores y excepciones en el Lenguaje Java.
Por lo tanto, como una superclase debe ser abstracta, en mi humilde opinión. Usarlo para conseguir StackTrace no es buen caso por esta definición.
Solución
No entiende por qué Throwable No es la clase abstracta.
La respuesta está claramente aquí .
¿Por qué no puede ser Throwable.getStackTrace (); o como en java.lang.Thread
Sencillamente, el getStackTrace()
llama al método getOurStackTrace()
que no es estática. Si getStackTrace()
era estático, por lo que debe getOurStackTrace()
. Esto no ocurrirá como método printStackTrace()
utiliza el getOurStackTrace()
. Esto se desarrolla en el JavaDoc:
Proporciona acceso mediante programación al información de seguimiento de la pila impresa printStackTrace ().
Fuente de java.lang.Throwable:
public StackTraceElement[] getStackTrace() {
return (StackTraceElement[]) getOurStackTrace().clone();
}
Además, si usted lee el código del método getOurStackTrace()
, verá que llama el método siguiente:
private native int getStackTraceDepth();
Por lo que yo sé, native
no puede ser estática (puedo estar equivocado).
Otros consejos
lo uso muy a menudo para el registro, así que estoy contento de que no es abstracta. Hay un método para obtener la pila de llamadas, Thread.currentThread (). GetStackTrace () pero esto devuelve un StackTraceElement [], que no es muy útil para el registro.
EDIT:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
Nota:. Este método también funciona para obtener un seguimiento de la pila de otro hilo que puede ser útil