4

子類中的方法可以覆蓋父類的方法,並拋出一個運行時異常時,在父類中的方法拋出也不例外?像這樣:方法在騎馬和繼承和異常

class X { public void foo() { System.out.print("X "); } } 

public class SubB extends X { 
    public void foo() throws RuntimeException { 
     super.foo(); 
     if (true) 
      throw new RuntimeException(); 
     System.out.print("B "); 
    } 

    public static void main(String[] args) { 
     new SubB().foo(); 
    } 
} 

回答

3

是的,因爲運行時異常不是方法簽名的一部分。 (你可以將它們添加但是編譯器並不關心,他們只是文檔)。

我認爲理由是,RuntimeExceptions通常是程序員的錯誤,好像NPE上或外出數組的邊界,所以它不試圖限制它們檢查異常的方式是有意義的。你不能規定,這個方法(以及任何覆蓋它的方法)永遠不會拋出一個NullPointerException異常,因爲JVM沒有做出這些保證。

在Java語言規範下Compile-Time Checking of Exceptions它說:

未檢查異常類(§11.1.1)從 編譯時檢查豁免。

在未經檢查的異常類中,錯誤類是免除的,因爲 它們可能發生在程序中的許多點,並且從它們的恢復是 困難或不可能。宣佈這種例外的計劃將是毫無意義地凌亂, 。複雜的計劃可能希望趕上 並試圖從這些條件中恢復。

未經檢查的異常類,運行時異常類 因爲豁免,在Java 編程語言的設計者的判斷,不必申報這種例外不會在建立程序的正確性顯著幫助 。在運行時,Java編程語言的許多操作和結構可能導致 出現異常。提供給Java編譯器 的信息和分析的編譯器執行的水平,通常 不足以證明不能 發生,即使這可能是顯而易見的程序員,這樣的運行時異常。需要聲明 這樣的異常類只會對程序員產生不利影響。

例如,某些代碼可能實現一個圓形數據結構 的是,通過構造,絕不能涉及空引用;那麼 程序員可以肯定的是不能 發生NullPointerException異常,但是這將是困難的Java編譯器來證明這一點。這是建立數據結構,例如全球 性能所需的 定理,證明技術已經超出了本 規範的範圍。

+0

但對於騎_over方法不應該投入更多的限制性exceptions_? – 2012-07-11 18:03:59

+4

這隻對檢查的異常很重要。 – 2012-07-11 18:05:15

+0

並且因爲運行時異常沒有被選中,所以對吧?謝謝! – 2012-07-11 18:08:22