淺談java異常處理(父子異常的處理)
我當(dāng)初學(xué)java異常處理的時(shí)候,對(duì)于父子異常的處理,我記得幾句話“子類方法只能拋出父類方法所拋出的異?;蛘呤瞧渥赢惓#宇悩?gòu)造器必須要拋出父類構(gòu)造器的異?;蛘咂涓府惓!薄D莻€(gè)時(shí)候還不知道子類方法為什么要這樣子拋出異常,后來通過學(xué)習(xí)《Thinking in Java》,我才明白其中的道理,現(xiàn)在我再來溫習(xí)一下。
一、子類方法只能拋出父類方法的異常或者是其子異常
對(duì)于這種限制,主要是因?yàn)樽宇愒谧鱿蛏限D(zhuǎn)型的時(shí)候,不能正確地捕獲異常
package thinkinginjava; public abstract class InningDemo1 { public void walk() throws BaseException{} public abstract void sing() throws BaseException; } class BaseException extends Exception{} class SubException1 extends BaseException{} class CupException extends Exception{}
package thinkinginjava; public interface OtherFunction { public void task() throws RuntimeException; }
package thinkinginjava; public class SubInningDemo1 extends InningDemo1 implements OtherFunction{ //子類方法可以拋出父類方法的異常 @Override public void walk() throws BaseException{} //但不能拋出父類中沒有的異常,否則編譯會(huì)出錯(cuò) //public void walk() throws Exception{} //子類方法可以拋出父類方法的子異常 @Override public void sing() throws SubException1{} //當(dāng)實(shí)現(xiàn)的接口和父類中的方法都有異常時(shí),可以選擇不拋出異常 public void task(){} }
就拿這個(gè)例子來說,假如子類中有這方法 public void walk() throws CupException{},拋出了父類方法沒有的異常,我們使用父類的引用指向子類
public void f(){ InningDemo1 inn = new SubInningDemo1(); inn.walk() ;//父類調(diào)用walk()方法時(shí),并不知道它會(huì)拋出CupException,從而f()方法不知如何捕獲異常。因此在編譯期就要防止子類方法亂拋異常。 }
從上面的例子中,我們也可以看到,子類方法可以不拋出異常
二、子類構(gòu)造器必須要拋出父類構(gòu)造器的異常或者其父異常
這是因?yàn)樽宇悩?gòu)造器中默認(rèn)添加了父類的構(gòu)造器
package thinkinginjava; public abstract class InningDemo2 { public InningDemo2() throws SubException{ } } class FatherException extends Exception{} class SubException extends FatherException{} class PenException extends Exception{}
package thinkinginjava; public class SubInningDemo2 extends InningDemo2{ public SubInningDemo2() throws FatherException { //子類構(gòu)造器中默認(rèn)添加了父類的構(gòu)造器,所以需要拋出父類的異?;蛘咂涓府惓? //super(); } }
三、異常丟失
1、在finally中拋出異常,可能會(huì)之前拋出的異常丟失
package thinkinginjava; public class FinallyException { public static void main(String[] args){ try{ try{ throw new RedException(); }finally{ //把上一個(gè)異常覆蓋掉 throw new BlueException(); } }catch(Exception e){ System.out.println(e); } } } class RedException extends Exception{} class BlueException extends Exception{}
運(yùn)行結(jié)果:thinkinginjava.BlueException
2、在finally中使用return,不會(huì)拋出異常
package thinkinginjava; public class ReturnException { public static void main(String[] args){ try{ throw new Exception(); }finally{ return; } } }
以上代碼我們看到它拋出了異常,但運(yùn)行時(shí)不會(huì)有任何輸出
以上這篇淺談java異常處理(父子異常的處理)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot發(fā)布dubbo服務(wù)注冊(cè)到nacos實(shí)現(xiàn)方式
這篇文章主要介紹了springboot發(fā)布dubbo服務(wù)注冊(cè)到nacos實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot自定義轉(zhuǎn)換器應(yīng)用實(shí)例講解
SpringBoot在響應(yīng)客戶端請(qǐng)求時(shí),將提交的數(shù)據(jù)封裝成對(duì)象時(shí),使用了內(nèi)置的轉(zhuǎn)換器,SpringBoot 也支持自定義轉(zhuǎn)換器,這個(gè)內(nèi)置轉(zhuǎn)換器在 debug的時(shí)候,可以看到,提供了124個(gè)內(nèi)置轉(zhuǎn)換器2022-08-08SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行代碼的幾種實(shí)現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行代碼的幾種實(shí)現(xiàn)方式,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02