簡體   English   中英

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

[英]why is java.lang.Throwable a class?

在java形容詞中以-able結尾是接口SerializableComparable等...那么為什么Throwable是一個類? 如果Throwable是一個界面,異常處理會不會更容易? (編輯:例如,異常類不需要擴展Exception / RuntimeException。)

顯然,現在改變它是不可能的。 但它可以抽象嗎? 這不會避免throw new Throwable()的壞習慣;

以下是James Gosling解釋他的決定:

Java開發人員連接程序 :為什么Throwable不是接口? 這個名字有點暗示它應該是。 能夠catch類型,即try {} catch (<some interface or class>) ,而不僅僅是類。 這將使Java [編程語言]更加靈活。

James GoslingThrowable和其他人不是接口的原因是因為我們決定,或者我很早就決定了。 我決定我希望某個狀態與每個被拋出的異常相關聯。 你不能用接口做到這一點; 你只能用課程來做。 那里的狀態基本上是標准的。 有一條消息,有一個快照,類似的東西 - 它總是在那里。 而且,如果你讓Throwable成為一個界面,那么誘惑就是分配,使任何舊的對象成為一個Throwable東西。 從風格上來說,投擲一般物體可能是一個壞主意,你想拋出的東西確實應該是那些真正捕捉異常性質和發生的事情的異常事物。 它們不僅僅是一般的數據結構。

參考

那么為什么Throwable是一堂課呢?

我可以想到兩個原因:

  1. 例外有州。 特別是消息,原因和堆棧跟蹤。
  2. JVM更容易實現高效的catch塊。 類層次結構檢查比接口檢查便宜。

如果Throwable是一個界面,異常處理會不會更容易?

無論異常是類還是接口,異常處理都是一個難題。 我實際上懷疑如果他們必須根據任意接口而不是類層次結構來命令它們的catch塊,它會使Java程序員更難。

但它可以抽象嗎?

從理論上講,是的。 在實踐中,沒有。 太多的代碼取決於能夠創建Throwable的實例以調用getStackTrace。

好的Hashtable也是一個具體的課程! 可以哈希的東西。

什么是克隆? 這不是一個正確的英文單詞。

FYI

你不能使用

void doSomething() throws Serializable

但你可以使用泛型!

<T extends Exception & Serializable> doSomething() throws T

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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