2011-03-03 57 views
0
class MyException extends Exception { 
    MyException() {} 
    MyException(String msg) { super(msg);} 
} 
public class NewException { 

    static void f() throws MyException { 
     System.out.println("throwing exception from f()"); 
     throw new ClassCastException(); 
    } 
    static void g() throws MyException { 
     System.out.println("throwing exception from g()"); 
     throw new MyException("parametrized "); 
    } 
    public static void main(String ...strings) { 
     try { 
      f(); 
     } 
     catch(MyException e) { 
      e.printStackTrace(System.out); 
     } 
     try { 
      g(); 
     } 
     catch(MyException e) { 
      e.printStackTrace(System.out); 
     } 
    } 
} 

函數f()我指定「MyException」異常將被拋出,實際上我拋出了一些與MyException沒有關係但仍然不抱怨的異常。爲什麼?編譯器何時需要我捕獲異常?

回答

5

ClassCastException延伸RuntimeException,這意味着它是unchecked,因此編譯器不需要你來處理它。

從Javadoc文檔RuntimeException

不需要的方法,其throws子句中RuntimeException的任何 子類 可能的方法的執行 期間拋出,但沒有抓到申報。

+0

什麼是運行時異常http://download.oracle.com/javase/1.4.2/docs/api/java/lang/RuntimeException.html – 2011-03-03 07:22:12

+0

好主意,我添加了Javadoc的鏈接/摘錄。 – ide 2011-03-03 07:27:17

1

IDE的答案是正確的 - 唯一的例外是哪個或java.lang.Exception一個子類(直接或間接)被「選中」,哪些是java.lang.RuntimeException或子類是檢查的異常。只需檢查從您的方法中拋出的異常(包括那些聲明爲您調用的方法拋出的異常)。這意味着不需要聲明例外,如Error的子類不是Exception(混淆,eh?)也不需要聲明。 (你也可以繼承Throwable直接,但一般不應該。)

從Java語言規範,section 11.2

編譯器的Java編程語言的檢查,在編譯時,一個程序包含檢查異常的處理程序,通過分析執行方法或構造函數會導致哪些檢查異常。對於可能導致的每個檢查異常,方法(§8.4.6)或構造函數(§8.8.5)的throws子句必須提及該異常的類別或該異常的類別的超類別之一。此編譯時檢查異常處理程序的存在旨在減少未正確處理的異常數量。

未經檢查的異常類是RuntimeException類及其子類,以及類Error及其子類。所有其他異常類都是檢查異常類。 Java API定義了許多異常類,既可以選中也可以不選中。額外的異常類,既可以選中也可以不選中,可以由程序員聲明。有關異常類層次結構的說明以及由Java API和Java虛擬機定義的一些異常類的說明,請參閱第11.5節。

在throws子句中指定的checked異常類是實現者與方法或構造函數的用戶之間的契約的一部分。重寫方法的throws子句可能沒有指定此方法將導致拋出任何被重寫的方法不允許的檢查異常,通過其throws子句拋出。當涉及接口時,多個方法聲明可能被一個覆蓋聲明覆蓋。在這種情況下,覆蓋聲明必須有一個與所有重寫聲明(§9.4)兼容的throws子句。

+0

不要忘記錯誤及其子類。第三類異常人會忘記,因爲他們可能永遠不會被抓到。 – DragonFax 2011-03-03 07:23:34

+0

@DragonFax:是的,我只是在編輯中明確提到這一點。但也不要忘記,類*可以*直接子類Throwable ... – 2011-03-03 07:24:51