2017-08-11 94 views
-4

衆所周知,異常是默認類,異常類擴展爲Throwable爲什麼異常是一個類而不是java中的接口?

我的問題是:爲什麼異常不是接口?

如果我們將嘗試模擬異常類作爲接口它會顯示錯誤。我試了一下,但仍然無法找到相同的確切原因。 這是我嘗試了代碼:

接口:

package com.prg; 
import com.thed.util.CustomException ; 
public interface ExceptionInterface extends Throwable{ 
    public String sayHello() throws CustomException { 
     return null; 
    } 
} 

類別:

package com.prg; 
import com.thed.util.CustomException ; 
public class ExceptionCheck implements ExceptionInterface { 
    public String sayHello() { 
     return "Hey"; 
    } 
    public ExceptionCheck() throws CustomException { 
     System.out.println("hi"); 
    } 
    public static void main (String[] args) throws CustomException { 
     System.out.println("how are you"); 
     throw new ExceptionInterface({ 
      public String sayHello() { return "Hey"; } 
     }); 
    }   
    } 

如果我改變接口類則它沒有顯示預計異常。但爲什麼不接口這是我的問題?

+2

因爲這是他們設計它的方式。 – EJP

回答

3

簡單:因爲有相當多的實施代碼Throwable類,這是整個層次的基地內被發現。正如一條評論提醒我們的那樣:還有很多異常相關代碼支持到JVM的本地部分 - 如果代碼必須處理實現Exception接口的任意對象,這可能非常困難。

中有,當你想給一個核心庫元素給用戶,其中包括實施使用接口是沒有意義的。

(記住,默認的方法 - 又名方法體 - 在Java中是不允許直到Java8!)

除此之外:接口是允許不同的「意見」對課程有用。換句話說:整數例如可以看作可比較的。可能會出現這種情況,只有將Integer對象作爲Comparable對象。但是真正的Integer的本質仍然是:它是一個表示一定範圍的整數的類。

現在想想異常! public class Foo implements Exception有什麼概念性的「意義」? Foo會如何「沒有」那個異常觀點?換句話說:例外在概念上也是「重要的」,足以成爲不同的類別!

請記住,類和接口存在模型抽象。也許我只是沒有足夠的創造力 - 但我不知道如何可能是一個Foo對象 - 但是,如果需要的話也是一個例外。

最後:一個類是一個類,而一個接口是一個接口。那些是不同的東西。唯一允許的關係是:類擴展類,並且可以實現接口。接口只能擴展其他接口。這就是Java語言設計的的簡單方法 - 而且你沒有辦法做你想要的代碼。

+0

對我來說,你推理的後半部分是最有說服力的。 –

+0

@JiriTousek當然。我的大腦似乎像java JIT一樣工作 - 它需要一個預熱階段。我的答案通常會在每次編輯時都會變得更好;-) – GhostCat

+0

對於異常工作,您需要一些無法在純Java中執行的實現,最明顯的是讓您的堆棧跟蹤(確定,使用Java 1.5,他們讓我們可以訪問那是通過Thread.getStackTrace(),但是一個類而不是接口的決定是在那之前做出的)。 –

相關問題