java 7中再談try catch

來源:互聯網
上載者:User

java 7中的try catch除了之前談到的新特性外,本文簡單來例子小結下,其實還是有不少地方要注意的,首先看一個典型的代碼:

先來兩個異常類:

 

Java代碼
  1. public class ExceptionA extends Exception{   
  2.     public ExceptionA(String message){   
  3.         super(message);   
  4.     }   
  5. }   
  6. public class ExceptionB extends Exception{   
  7.     public ExceptionB(String message){   
  8.         super(message);   
  9.     }   
  10. }  
public class ExceptionA extends Exception{    public ExceptionA(String message){        super(message);    }}public class ExceptionB extends Exception{    public ExceptionB(String message){        super(message);    }}

再建立一個資源類oldresource,如下: Java代碼

  1.   
  2. public class OldResource{   
  3.     public void doSomeWork(String work) throws ExceptionA{   
  4.         System.out.println("Doing: "+work);   
  5.         throw new ExceptionA("Exception occured while doing work");   
  6.     }   
  7.     public void close() throws ExceptionB{   
  8.         System.out.println("Closing the resource");   
  9.         throw new ExceptionB("Exception occured while closing");   
  10.     }   
  11. }  
public class OldResource{    public void doSomeWork(String work) throws ExceptionA{        System.out.println("Doing: "+work);        throw new ExceptionA("Exception occured while doing work");    }    public void close() throws ExceptionB{        System.out.println("Closing the resource");        throw new ExceptionB("Exception occured while closing");    }}

我們開始使用之: Java代碼

  1. public class OldTry {   
  2.     public static void main(String[] args) {   
  3.         OldResource res = null;   
  4.         try {   
  5.             res = new OldResource();   
  6.             res.doSomeWork("Writing an article");   
  7.         } catch (Exception e) {   
  8.             System.out.println("Exception Message: "+   
  9.                       e.getMessage()+" Exception Type: "+e.getClass().getName());   
  10.         } finally{   
  11.             try {   
  12.                 res.close();   
  13.             } catch (Exception e) {   
  14.                 System.out.println("Exception Message: "+   
  15.                          e.getMessage()+" Exception Type: "+e.getClass().getName());   
  16.             }   
  17.         }   
  18.     }   
  19. }  
public class OldTry {    public static void main(String[] args) {        OldResource res = null;        try {            res = new OldResource();            res.doSomeWork("Writing an article");        } catch (Exception e) {            System.out.println("Exception Message: "+                      e.getMessage()+" Exception Type: "+e.getClass().getName());        } finally{            try {                res.close();            } catch (Exception e) {                System.out.println("Exception Message: "+                         e.getMessage()+" Exception Type: "+e.getClass().getName());            }        }    }}

看輸出:
   Doing: Writing an article
Exception Message: Exception occured while doing work Exception Type: javaapplication4.ExceptionA

Closing the resource
Exception Message: Exception occured while closing Exception Type: javaapplication4.ExceptionB

再來看java 7中的新寫法,代碼如下: Java代碼

  1. public class NewResource implements AutoCloseable{   
  2.     String closingMessage;   
  3.     
  4.     public NewResource(String closingMessage) {   
  5.         this.closingMessage = closingMessage;   
  6.     }   
  7.     
  8.     public void doSomeWork(String work) throws ExceptionA{   
  9.         System.out.println(work);   
  10.         throw new ExceptionA("Exception thrown while doing some work");   
  11.     }   
  12.     public void close() throws ExceptionB{   
  13.         System.out.println(closingMessage);   
  14.         throw new ExceptionB("Exception thrown while closing");   
  15.     }   
  16.     
  17.     public void doSomeWork(NewResource res) throws ExceptionA{   
  18.         res.doSomeWork("Wow res getting res to do work");   
  19.     }   
  20. }  
public class NewResource implements AutoCloseable{    String closingMessage;     public NewResource(String closingMessage) {        this.closingMessage = closingMessage;    }     public void doSomeWork(String work) throws ExceptionA{        System.out.println(work);        throw new ExceptionA("Exception thrown while doing some work");    }    public void close() throws ExceptionB{        System.out.println(closingMessage);        throw new ExceptionB("Exception thrown while closing");    }     public void doSomeWork(NewResource res) throws ExceptionA{        res.doSomeWork("Wow res getting res to do work");    }}

  在JAVA 7中,要自動在try catch中利用到新特性,想不寫那麼多東西就關閉資源,則可以編寫實現 AutoCloseable類的,則都可以利用該特性了。

在主程式中調用:
 

Java代碼
  1. public class TryWithRes {   
  2.     public static void main(String[] args) {   
  3.         try(NewResource res = new NewResource("Res1 closing")){   
  4.             res.doSomeWork("Listening to podcast");   
  5.         } catch(Exception e){   
  6.             System.out.println("Exception: "+   
  7.              e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());   
  8.         }   
  9.     }   
  10. }  
public class TryWithRes {    public static void main(String[] args) {        try(NewResource res = new NewResource("Res1 closing")){            res.doSomeWork("Listening to podcast");        } catch(Exception e){            System.out.println("Exception: "+     e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());        }    }}

輸出結果為:
  Listening to podcast
Res1 closing
Exception: Exception thrown while doing some work Thrown by: ExceptionA

大家可以思考下為什麼這樣輸出,在新特性中,資源的自動關閉調用了close(),而
NewResource res = new NewResource("Res1 closing")){
已經為closingMessage賦值了,而最後的Exception e是輸出了,suprred掉了
exception a和exception b的輸出。

再看一個多層嵌套的try catch例子
 

Java代碼
  1. public class TryWithRes {   
  2.     public static void main(String[] args) {   
  3.         try(NewResource res = new NewResource("Res1 closing");   
  4.             NewResource res2 = new NewResource("Res2 closing")){   
  5.             try(NewResource nestedRes = new NewResource("Nestedres closing")){   
  6.                 nestedRes.doSomeWork(res2);   
  7.             }   
  8.         } catch(Exception e){   
  9.             System.out.println("Exception: "+   
  10.             e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());   
  11.         }   
  12.     
  13.     }   
  14. }  
public class TryWithRes {    public static void main(String[] args) {        try(NewResource res = new NewResource("Res1 closing");            NewResource res2 = new NewResource("Res2 closing")){            try(NewResource nestedRes = new NewResource("Nestedres closing")){                nestedRes.doSomeWork(res2);            }        } catch(Exception e){            System.out.println("Exception: "+    e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());        }     }}

輸出:
  Wow res getting res to do work
Nestedres closing
Res2 closing
Res1 closing
Exception: Exception thrown while doing some work Thrown by: ExceptionA

可以看到,後聲明的資源上被最先CLOSE掉的,這裡各自原先的exception都被supressed掉了。還可以用e.getSuppressed() 把屏蔽掉的exception都放來,比如
Java代碼

  1. public class TryWithRes {   
  2.     public static void main(String[] args) {   
  3.         try(NewResource res = new NewResource("Res1 closing");   
  4.             NewResource res2 = new NewResource("Res2 closing")){   
  5.             try(NewResource nestedRes = new NewResource("Nestedres closing")){   
  6.                 nestedRes.doSomeWork(res2);   
  7.             }   
  8.         } catch(Exception e){   
  9.             System.out.println("Exception: "+   
  10.             e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());   
  11.             if (e.getSuppressed() != null){   
  12.                 for (Throwable t : e.getSuppressed()){   
  13.                     System.out.println(t.getMessage()+   
  14.                                " Class: "+t.getClass().getSimpleName());   
  15.                 }   
  16.             }   
  17.         }   
  18.     
  19.     }   
  20. }  
public class TryWithRes {    public static void main(String[] args) {        try(NewResource res = new NewResource("Res1 closing");            NewResource res2 = new NewResource("Res2 closing")){            try(NewResource nestedRes = new NewResource("Nestedres closing")){                nestedRes.doSomeWork(res2);            }        } catch(Exception e){            System.out.println("Exception: "+    e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());            if (e.getSuppressed() != null){                for (Throwable t : e.getSuppressed()){                    System.out.println(t.getMessage()+                               " Class: "+t.getClass().getSimpleName());                }            }        }     }}

輸出顯示:
Wow res getting res to do work
Nestedres closing
Res2 closing
Res1 closing
Exception: Exception thrown while doing some work Thrown by: ExceptionA
Exception thrown while closing Class: ExceptionB
Exception thrown while closing Class: ExceptionB
Exception thrown while closing Class: ExceptionB

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.