国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

基于java涉及父子類的異常詳解

2019-11-26 13:52:20
字體:
供稿:網(wǎng)友

java中的異常涉及到父子類的問題,可以歸納為一句話:子類的構(gòu)造函數(shù)拋出的異常必須包含父類的異常,子類的方法可以選擇拋出“范圍小于等于”父類的異常或不拋出異常。

1. 為什么構(gòu)造函數(shù)必須拋出包含父類的異常?

在《thingking in java》中有這么一段話:

異常限制:當(dāng)覆蓋方法時,只能拋出在基類方法的異常說明中列出的那些異常

異常限制對構(gòu)造器不起作用,你會發(fā)現(xiàn)StormyInning的構(gòu)造器可以拋出任何異常,而不必理會基類構(gòu)造函數(shù)所拋出的異常。然而因為必須構(gòu)造函數(shù)必須以這樣或那樣的方式被調(diào)用,子類構(gòu)造函數(shù)的異常說明必須包含基類構(gòu)造器的異常說明

這段話起初一開比較繞,但是嘻嘻看一遍就會明白:

首先,異常說明只針對覆蓋方法,而構(gòu)造函數(shù)明顯不在這個范圍,所以子類構(gòu)造函數(shù)可以拋出任何異常,而不用顧及父類構(gòu)造函數(shù)所拋出的異常。但是在new 一個子類對象的時候,父類構(gòu)造函數(shù)一定會被調(diào)用,所以子類構(gòu)造函數(shù)調(diào)用的對應(yīng)的父類構(gòu)造函數(shù)所拋出的異常就必須考慮在內(nèi),此時又因為“子類構(gòu)造函數(shù)無法捕獲父類構(gòu)造函數(shù)所拋出的異常(后面會提)”,所以子類構(gòu)造函數(shù)必須拋出這個異常。

class SomeException extends Exception{}  class TheOtherException extends Exception{}  class BaseC {   public BaseC()throws SomeException{}      public BaseC(int a)throws TheOtherException{} }  class SubC extends BaseC {   public SubC() throws SomeException //如果不拋出異常就會報錯   {     super(); //由于調(diào)用的基類的默認(rèn)構(gòu)造函數(shù), 所以要拋出SomeException    //super(37) ; //如果將super()替換成這里,就必須拋出TheOtherException   }    }

2. 為什么子類構(gòu)造函數(shù)無法捕獲父類構(gòu)造函數(shù)所拋出的異常?

 因為子類如果想要捕獲父類拋出的異常,就必須顯示地調(diào)用super() ; 或者super(xxx...); 然而super()和this()這些都有一個特性, 就是必須將他們放在第一行, 這與try{}catch{}相矛盾, 所以無法捕獲

3. 當(dāng)子類繼承的父類和接口存在相同的方法名時,這時的處理方式就必須遵循異常限制。

class SomeException extends Exception{}  class TheOtherException extends Exception{}  interface InterF {   public void function()throws TheOtherException; } class BaseC {   public void function()throws SomeException{} }  class SubC extends BaseC implements InterF {   //此時只能選擇不拋出異常   public void function(){}      //報錯:Exception SomeException is not compatible with throws clause in InterF.function()   // public void function()throws SomeException{} ;   //報錯:Exception TheOtherException is not compatible with throws clause in BaseC.function()   // public void function()throws TheOtherException{} ; }

4. 為什么子類只能拋出在基類方法的異常說明中列出的那些異常?

因為子類存在向上轉(zhuǎn)化成父類的可能性,如果允許子類隨意拋出異常的話,那么向上轉(zhuǎn)化成父類時,該方法的接口(姑且這么叫吧)會變成父類的方法類型,此時問題來了,子類會拋出異常,而父類卻無法對該異常做出處理,所以為保證對象的可替換型,強制要求“只能拋出在基類方法的異常說明中列出的那些異?!薄?/p>

這里所說的“那些異?!边€包括這些異常的子異常!

5. 這一點不知道算不算,也許是我比較愚鈍吧,我在看的時候想了好久才明白過來,姑且記下來吧。

class SomeException extends Exception{}  class BaseC {   public void function()throws SomeException{}//如果這里拋出的異常是一個運行時異常子類就可以不對其進(jìn)行異常處理 }  class SubC extends BaseC {<BR>//這兩個function()所進(jìn)行的super.function()的都屬于正常的函數(shù)調(diào)用,不屬于異常處理的范圍, 但是這個函數(shù)本身要符合異常處理的規(guī)范! /*   public void function()throws SomeException   {     super.function();   } */  public void function()   {     try    {       super.function() ;     }     catch(SomeException e)     {       e.printStackTrace();     }   } }

以上這篇基于java涉及父子類的異常詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 门源| 马尔康县| 宜城市| 潞西市| 嘉善县| 霍林郭勒市| 化州市| 澄迈县| 故城县| 宁强县| 佳木斯市| 卢龙县| 合川市| 宜兴市| 安阳市| 靖边县| 仁化县| 蒙自县| 通江县| 台湾省| 南投市| 洪湖市| 乡宁县| 梁平县| 合水县| 乐陵市| 阿坝县| 左贡县| 伊川县| 惠水县| 常州市| 萝北县| 黄石市| 涟水县| 南汇区| 东至县| 安福县| 龙井市| 米林县| 华阴市| 探索|