2013-03-21 47 views
-2

我有類拋出更高的檢查異常在重寫的方法。我知道這是不允許的,但爲什麼這個代碼有效?爲什麼類在拋出的方法中引發更高的檢查異常?

package personaltestlevel1; 



public class OverrideExcept { 

    public static void main(String args[]) { 

     S1 s = new S2(); 
     try 
     { 
     s.show(); 
     }catch (NullPointerException e){ 
     System.out.printf(e.getMessage()); 
     } 
    } 

} 

class S1{ 


    public void show() throws NullPointerException { 
     try 
     { 
     System.out.println("not overriden"); 
     }catch (Exception e){ 
     throw new NullPointerException(); 
     } 
    } 
} 

class S2 extends S1{ 

    public void show() throws RuntimeException { 
     try 
     { 
     System.err.println("overriden"); 
     }catch (Exception e){ 
     throw new RuntimeException();} 


    } 
} 

我已經更新了我的checked異常樣本 - 它的工作原理呢。

+4

他們沒有檢查異常! – 2013-03-21 18:59:39

+0

我已更新我的示例與檢查異常 - 無論如何它的作品。 – vico 2013-03-21 19:22:37

+0

哪個版本的show()拋出一個檢查的異常?據我所知,一個拋出RuntiimeException和另一個NullPointerException,都未選中。 – 2013-03-21 19:34:45

回答

0

你不能在重寫的方法中拋出更高或更大的異常,因爲如果你使用超類引用(多態)引用派生類對象,那麼編譯器將檢查超類方法拋出的異常類型,而不是實際派生該方法的類實現在運行時解決。

在這裏,您可以拋出更大的異常,因爲它是一個未經檢查的異常(即編譯器不打擾並檢查未檢查異常的類型)。

但是從方法拋出RuntimeException是一種不好的編程習慣。

+0

「但是從方法中拋出RuntimeException是一種不好的編程習慣。」我認爲唯一可能的地方是方法和構造函數。 – 2013-03-21 19:18:40

+0

我的意思是你應該在代碼本身中處理這些異常,或者在拋出之前將它們包裝在檢查的異常中,因爲它們是未經檢查的異常,編譯器不會停止調用程序來處理它,並可能導致完全災難。如果你不能在方法中處理它,那麼將它包裝在檢查的異常中並拋出檢查的異常,以便調用程序相應地處理它。 – 2013-03-21 19:22:56

+0

我已更新我的示例與檢查異常 - 它無論如何工作。 – vico 2013-03-21 19:24:10

1

讓我們作爲例子下面的代碼(有一些籤例外):

public class Parent { 
    public void m() throws Exception { 

    } 
} 

public class Child extends Parent { 
    public void m() throws FileNotFoundException { 

    } 
} 

public class Client { 
    public void test() { 
     Parent p = new Child(); 
     try { 
      p.m(); 
     } catch (Exception e) {   
      e.printStackTrace(); 
     } 
    } 
} 

即使在Parentm僅聲明在throws子句Exception,所述Child允許申報FileNotFoundException因爲FileNotFoundException是-a Exception

如果你看它調用mParent可以捕獲通過mChild拋出的FileNotFoundException(實際的對象),由剛剛宣佈Exception在它的catchClient

我認爲這解釋了爲什麼它允許重寫方法拋出一個不同的檢查異常或者被覆蓋的方法的孩子不合理。

+0

準確地說,你可以從重寫的方法中拋出任何異常的子類型,異常本身也會處理它的子類型。 :-) – 2013-03-21 19:27:16