2011-05-27 53 views
1

在下面的示例中,如果將RuntimeException替換爲其他一些異常,則編譯器會引發編譯錯誤。但對於運行時異常,它不會拋出任何東西。爲什麼?請解釋。運行時異常沒有編譯錯誤。爲什麼?

class A { 
    public void process() { 
     System.out.print("A,"); 

    } 
} 

class B extends A { 
    public void process() throws RuntimeException { 
     System.out.print("B,"); 
     throw new RuntimeException(); 
    } 

    public static void main(String[] args) { 
     A a = new B(); 
     a.process(); 
    } 
} 
+0

,因爲它是一個運行時異常 – fmucar 2011-05-27 09:58:57

回答

4

RuntimeException這就是我們所說的「未經檢查的例外」。

這意味着,編譯器不檢查它們是否被代碼捕獲。

原因是,我們有一些例外情況,我們通常不希望處理或聲明。例如,NullPointerException s可能會被拋出到代碼中的很多地方,如果我們只處理它們,如果我們明確地決定,它會更方便。

參見:

1

這就是爲什麼它被稱爲RuntimeException的:)

嚴重的是,RuntimeException的(從它繼承所有所有異常)被稱爲「unchecked異常」和整點是,他們不是由編譯器檢查。

0

原因是這樣的事實,即爲覆蓋方法聲明的檢查異常必須與覆蓋方法的簽名相匹配。否則,由於方法簽名不匹配,代碼將無法編譯。在重寫方法中聲明未檢查的異常時很好,因爲這些異常的名稱建議不是由編譯器檢查檢查

1

這需要編譯器中,由於the following requirement in the Java Language Specification

11.2.5爲什麼運行時例外,不檢查 被免除

運行時異常類 (RuntimeException的和它的子類)編譯時 檢查是因爲,在判斷 的Java編程設計者 語言中,不得不聲明這樣的 excep tions不會顯着幫助 建立 程序的正確性。 Java編程 語言的許多操作和構造都可能導致運行時出現異常。可 到編譯器的信息, 分析編譯器執行的水平,是 通常不足以建立 這樣的運行時異常不能 發生,即使這可能是顯而易見 給程序員。要求聲明這樣的 異常類將 僅僅是對程序員的一種刺激。

例如,某些代碼可能會執行一個循環數據結構 ,通過構造,永遠不會有 涉及空引用;那麼 程序員可以肯定的是不能出現 NullPointerException異常,但 它會爲編譯器 證明這是困難的。這是建立數據 結構 這樣的全球性所需的定理,證明 技術超出了本 規範的範圍。

不像checked異常,運行時異常(或unchecked異常)沒有定義調用者和被調用的方法之間的合同,因爲他們通常表示一個錯誤的條件,那往往是由主叫方解決,如果它是遵守合同。

如果編譯器將被賦予強制執行這樣的合同的任務,這將導致額外的複雜性(在語言本身和代碼人寫)。試想一下,強制每種方法檢查空參數,並要求程序員拋出這樣的異常(並在throws子句中聲明這樣的異常)。更簡單的方法是指定一個合約,該合約聲明一個方法不會對空參數進行操作,並且調用者應該期望捕獲NullPointerExceptions;如果調用者想要避免這種情況,它必須在調用方法之前檢查參數。

相關問題