java異常處理(父子異常的處理),java異常處理

來源:互聯網
上載者:User

java異常處理(父子異常的處理),java異常處理

  我當初學java異常處理的時候,對於父子異常的處理,我記得幾句話“子類方法只能拋出父類方法所拋出的異常或者是其子異常,子類構造器必須要拋出父類構造器的異常或者其父異常”。那個時候還不知道子類方法為什麼要這樣子拋出異常,後來通過學習《Thinking in Java》,我才明白其中的道理,現在我再來溫習一下。

一、子類方法只能拋出父類方法的異常或者是其子異常

  對於這種限制,主要是因為子類在做向上轉型的時候,不能正確地捕獲異常

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{}        //但不能拋出父類中沒有的異常,否則編譯會出錯    //public void walk() throws Exception{}        //子類方法可以拋出父類方法的子異常    @Override    public void sing() throws SubException1{}        //當實現的介面和父類中的方法都有異常時,可以選擇不拋出異常    public void task(){}}

 

  就拿這個例子來說,假如子類中有這方法 public void walk() throws CupException{},拋出了父類方法沒有的異常,我們使用父類的引用指向子類

  public void f(){

    InningDemo1 inn = new SubInningDemo1();

    inn.walk() ;//父類調用walk()方法時,並不知道它會拋出CupException,從而f()方法不知如何捕獲異常。因此在編譯期就要防止子類方法亂拋異常。

  }

  從上面的例子中,我們也可以看到,子類方法可以不拋出異常

 

二、子類構造器必須要拋出父類構造器的異常或者其父異常

  這是因為子類構造器中預設添加了父類的構造器

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 {        //子類構造器中預設添加了父類的構造器,所以需要拋出父類的異常或者其父異常        //super();    }}

 

三、異常丟失

1、在finally中拋出異常,可能會之前拋出的異常丟失

package thinkinginjava;public class FinallyException {    public static void main(String[] args){        try{            try{                throw new RedException();            }finally{                //把上一個異常覆蓋掉                throw new BlueException();            }        }catch(Exception e){            System.out.println(e);        }    }}class RedException extends Exception{}class BlueException extends Exception{}

 

運行結果:thinkinginjava.BlueException

2、在finally中使用return,不會拋出異常

package thinkinginjava;public class ReturnException {    public static void main(String[] args){        try{            throw new Exception();        }finally{            return;        }    }}

以上代碼我們看到它拋出了異常,但運行時不會有任何輸出

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.