簡體   English   中英

為什么java.lang.Throwable不是一個抽象類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM