可能重复:why-is-java-lang-throwable-a-class
嗨!我不明白为什么Throwable不是抽象类。我只看到一个用例:在用于计算调用层次结构的日志记录系统中。但它可以是这个或其他类的一些静态方法。那么,为什么?)
感谢。
UPD
来自java.util.logging.LogRecord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
为什么它不能是Throwable.getStackTrace();
或java.lang.Thread
(new Exception()).getStackTrace();
通过这种方式我们可以避免throw new Throwable();
UPD2 来自javadoc
Throwable类是超类 中的所有错误和例外 Java语言。
所以,作为一个超类,它应该是抽象的,imho。使用它来获取堆栈跟踪并不是这个定义的好例子。
答案 0 :(得分:3)
我不明白为什么Throwable 不是抽象类。
答案清楚地说明here。
为什么不能 Throwable.getStackTrace();或者如同 java.lang.Thread中
很简单,getStackTrace()
调用非静态的getOurStackTrace()
方法。如果getStackTrace()
是静态的,getOurStackTrace()
也是如此。由于printStackTrace()
方法使用getOurStackTrace()
,因此不会发生这种情况。这在JavaDoc中详细说明:
提供以编程方式访问 堆栈跟踪信息打印 的printStackTrace()。
java.lang.Throwable的来源:
public StackTraceElement[] getStackTrace() {
return (StackTraceElement[]) getOurStackTrace().clone();
}
<击>
此外,如果您阅读getOurStackTrace()
方法的代码,您会看到它调用以下方法:
private native int getStackTraceDepth();
据我所知,native
不能是静态的(我可能错了)。
击>
答案 1 :(得分:1)
我经常使用它来记录,所以我很高兴它不是抽象的。有一种获取调用堆栈的方法,Thread.currentThread()。getStackTrace()但这会返回一个StackTraceElement [],这对于日志记录来说并不是很有用。
编辑:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
注意:此方法也可用于获取另一个可以方便的线程的堆栈跟踪。