为什么java.lang.th.thable throwable thraver thravers class?
-
29-09-2019 - |
题
可能的重复: 为什么是in-is-java-lang-throw-a级
你好!我不明白为什么投掷不是抽象类。我只看到其中一个用例:在记录系统中以弄清楚呼叫层次结构。但这可能是该类别或其他类的静态方法。所以为什么?)
谢谢。
UPD
来自Java.util.logging.Logrocord
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
为什么不能 Throwable.getStackTrace();
或如java.lang.thread
(new Exception()).getStackTrace();
这样我们可以避免 throw new Throwable();
UPD2来自Javadoc
可抛出的类是Java语言中所有错误和异常的超类。
因此,作为一个超类,应该是抽象的,恕我直言。根据此定义,将其用于获得StackTrace并不是一个好情况。
解决方案
我不明白为什么投掷不是抽象类。
答案明确指出 这里.
为什么不能抛出。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
不能静态(我可能错了)。
其他提示
我经常将其用于伐木,所以我很高兴它不是抽象的。有一种方法可以获取调用堆栈,thread.currentthread()。getStackTrace(),但是这返回了stackTraceElement [] [],这对于记录并不是很有用。
编辑:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
注意:此方法还可以获取可以方便的另一个线程的堆栈跟踪。