要清楚的知道子類重寫父類的方法時,當父類拋出異常時,子類拋出的異常需要怎么寫,首先必須了解異常的類型。
Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。
運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
非運行時異常 (編譯異常):是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
我看到一篇博文這樣說
1,子類重寫父類方法要拋出與父類一致的異常,或者不拋出異常
2,子類重寫父類方法所拋出的異常不能超過父類的范疇
先看例子1
public class TestRegularExperssion { public void printA(float a,float b)throws SQLException { } } class TestRegularExpressionA extends TestRegularExperssion { public void printA(float a,float b)throws NullPointerException { } }
例子1:父類拋出的是CheckedException,子類拋出的是RuntimeException,編譯通過,看來第一條規則和第二條規則都不對。
例子2
public class TestRegularExperssion { public void printA(float a,float b)throws NullPointerException { } } class TestRegularExpressionA extends TestRegularExperssion { public void printA(float a,float b)throws SQLException { } }
例子二:將父類和子類拋出的異常類型換了 結果:編譯不通過
經過試驗我得到的規則是
如果是RuntimeException Java編譯器不會檢查它,所以你在子類繼承中使用它,父類都沒有關系。
如果不是RuntimeException 子類不能拋出比父類范圍更廣的異常,子類拋出更明確的異常。