在繼承中重寫方法時拋出異常的問題


要清楚的知道子類重寫父類的方法時,當父類拋出異常時,子類拋出的異常需要怎么寫,首先必須了解異常的類型。

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  子類不能拋出比父類范圍更廣的異常,子類拋出更明確的異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM