[英]why isn't java.lang.Throwable an abstract class?
可能重復: 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();
來自javadoc的upd2
Throwable類是Java語言中所有錯誤和異常的超類。
所以,作為一個超類,它應該是抽象的,imho。 使用它來獲取堆棧跟蹤不是這個定義的好例子。
我不明白為什么Throwable不是抽象類。
為什么它不能是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
不能是靜態的(我可能是錯的)。
我經常使用它來記錄,所以我很高興它不是抽象的。 有一種獲取調用堆棧的方法,Thread.currentThread()。getStackTrace()但是這會返回一個StackTraceElement [],這對於日志記錄來說並不是很有用。
編輯:
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
注意:此方法也可用於獲取另一個可以方便的線程的堆棧跟蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.