文章的標題看似自相矛盾,然而我在「正確」二字上打了引號。咱們來看一個例子,關於Java異常處理(Exception Handling)的一些知識點。less
看下面這段程序。方法pleaseThrow接受一個Exception的實例,而後簡單地將該實例拋出。而後調用這個方法時,我傳入了一個SQLException的實例。由於pleaseThrow的調用包裹在一個try catch塊裏,ui
問題:plesseThrow方法拋出的SQLException能夠成功被catch住麼?code
public class ExceptionForQuiz<T extends Exception> { private void pleaseThrow(final Exception t) throws T { throw (T) t; } public static void main(final String[] args) { try { new ExceptionForQuiz<RuntimeException>().pleaseThrow(new SQLException()); } catch( final SQLException ex){ System.out.println("Jerry print"); ex.printStackTrace(); } } }
答案:上面這段代碼有語法錯誤,不能經過編譯!io
咱們來一步步分析。編譯
Java類ExceptionForQuiz使用了一個泛型語法,T extends Exception意思是這個泛型類實例化的時候,傳入的類型參數T必須是Exception以及它的子類。class
我在實例化類ExceptionForQuiz時,傳入的類型參數是RuntimeException。泛型