亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java異常處理之try...catch...finally詳解

2024-07-14 08:43:26
字體:
來源:轉載
供稿:網友

異常處理機制已經成為判斷一門編程語言是否成熟的標準之一,其對代碼的健壯性有很大影響。一直以來異常處理使用不是很得心應手,今天對異常進行了較為深入的學習,這篇主要是對try…catch…finally的一個總結。

一.java繼承體系

Java語言為異常處理提供了豐富的異常類,這些類之間有嚴格的繼承關系。如圖:

Java,異常處理,try,catch,finally

從圖中我們可以看出,所有的類都是繼承于Throwable這個父類,java將所有的非正常情況分為兩種:Error(錯誤)和Exception(異常),Error錯誤一般是于虛擬機相關的問題,如系統崩潰、虛擬機錯誤、動態鏈接失敗等,這種錯誤是無法恢復或不可能捕獲的,而我們能處理的是Exception類下的錯誤。Exception則分為兩大類,RuntimeException(運行時異常)和其他異常(Checked異常),其他異常(Checked異常)是各種形式的編譯錯誤,是我們必須顯示處理才可以通過變異的;而運行時錯誤顧名思義就是程序已經通過了編譯,在運行時出現的錯誤,若是對這些異常置之不理會導致程序停止運行、占用資源無法釋放甚至導致系統崩潰。

二.java異常處理機制及實現方法

1.主要依賴于try、catch、finally、throw和throws這五個關鍵字。(throw和throws本篇不涉及)

2.try…catch…finally處理機制:try關鍵字后跟一個花括號栝起的代碼塊(即使該代碼塊只有一行也不能省略花括號),簡稱try塊。catch對應異常類型和代碼塊,用于表明更改catch塊用于處理該種類型的異常。一個try塊后可以跟多個catch塊。在catch塊后還可以跟一個finally塊,finally塊用于回收在try塊里打開的資源。

這樣講過于抽象,那我們看幾個例子:

e.g.1 try…catch語句塊

//功能:對輸入的兩個數進行相除運算public class DivTest {  public static void main(String[] args) {    try {      int a = Integer.parseInt(args[0]);      int b = Integer.parseInt(args[1]);      int c = a/b;      System.out.println("您輸入的兩個數相除的結果是:" + c);    } catch(IndexOutOfBoundsException ie) {      System.out.println("數組越界");    } catch(NumberFormatException ne) {      System.out.println("數字格式異常");    } catch(ArithmeticException ae) {      System.out.println("算術異常");    } catch(Exception e) {      System.out.println("未知異常");    }   }}

以上代碼我們看到,對不同的異常情況作了不同的處理:輸入參數不夠會發生數組越界異常、輸入參數不是數字發生數字格式異常、若輸入第二個數是0,則發生除0異常,調用算術異常進行處理、出現其他異常時那么該異常對象必定是Exception類或其子類的實例,java調用Exception類對其進行處理,前三種異常類均是RuntimeException的子類。在使用try…catch語句塊時需要知道或注意以下幾點:

1) 處理過程:代碼在執行的時候,進入try塊,若是在try塊中出現了異常,系統會自動生成一個一場對象,該對象被提交給java運行時環境,這就是異常的拋出;在java運行時環境收到異常對象時則把該對象交給catch塊處理,這個過程叫做異常的捕獲;若找到相應的catch塊就執行catch塊中的代碼,若沒有找到,則運行時環境終止,程序也退出。 

2) 執行一次try塊只執行一個catch塊 

3) 有多個catch塊并有繼承關系的情況下必須先寫子類后寫父類(即先捕獲小異常再捕獲大異常),若寫反在編譯時就會報錯 

4) Java7提供的多異常捕獲:在Java7之前,每一個catch塊只能捕獲一種異常,但從java7開始,一個catch塊可以捕獲多種類型的異常。在使用多異常捕獲應注意兩點:

  • (1) 多種異常之間用豎線( | )隔開 
  • (2) 多種異常對象被final隱式修飾,因此程序不能對其重新賦值

以下代碼是多異常捕獲的例子:

e.g.2

//多異常捕獲public class MultiExceptionTest {  public static void main(String[] args) {    try {      int a = Integer.parseInt(args[0]);      int b = Integer.parseInt(args[1]);      int c = a/b;      System.out.println("您輸入的兩個數相除的結果是:" + c);    } catch(IndexOutOfBoundsException|NumberFormatException|    ArithmeticException ie) {      System.out.println("數組越界或數字格式異?;蛩阈g異常");      ie = new ArithmeticExcrption("test");  //①    } catch(Exception e) {      System.out.println("未知異常");      e = new RuntimeException("test");  //②    }   }}

可以看出,以上代碼中,①號代碼是錯誤的,因為ie是被final隱式修飾的對象,②號代碼是正確的

3. 使用finally回收資源:有些時候我們在try塊中打開了一些物理資源(例如數據庫鏈接、網絡連接和磁盤文件等),這些資源都應進行顯示回收。有人說java不是有垃圾回收機制嗎?java的垃圾回收機制是自動回收堆內存中對象所占用的內存,而物理資源是不會自動回收的。

finally重點學習以下幾點:

  • 1) 執行過程以及引入finally的原因:finally最后執行并且最后執行,物理資源回收放在finally塊中的原因就是finally塊一定會被執行。相反,若是放在try塊中,在執行之前就出現異常則跳轉至catch塊中,則回收資源的代碼不會被執行;同樣的,若是放在catch塊中,若不發生異常,那么catch塊就不會被執行
  • 2) 若是在catch快中有return語句,則先執行完finally中的程序后再回到catch塊中并執行return語句
  • 3) 若是在finally中有return語句,那么try塊和catch塊中的return語句都會失效,不會被執行
  • 4) 若在catch塊中強制退出虛擬機,如使用System.exit(1)語句,則會直接退出程序,finally也不會得到執行

e.g.3

//該類功能:打開a.txt文件,在finally塊中對資源進行回收/* 對代碼中一些方法的解釋: * 所有異常都包含以下幾種訪問異常信息的常用方法: * getMessage():返回該異常的詳細描述字符串 * printStackTrace():將該異常的跟蹤棧信息輸出到標準錯誤輸出 * printStaceTrace(PrintStack s):將該異常的跟蹤棧信息到執行輸出流 * getStackTrace():返回該異常的跟蹤棧信息 **/public class FinallyTest {  public static void main(String[] args) {    FileInputStream fis = null;    try {      fis = new FileInputStream("a.txt");    }catch(IOException ioe) {      System.out.println(ioe.getMessage());      return;      //①      System.exit(1);  //②    }finally {      if(fis != null) {        try{          fis.close();        }catch(IOException ioe) {          ioe.printStackTrace();        }      }      System.out.println("執行finally塊里的資源回收!");    }  }}

注釋掉②號代碼運行以上程序,我們看到的結果是:

a.txt (系統找不到該文件。)
程序已經執行了finally里的資源回收!

注釋掉①號代碼運行以上程序,我們看到的結果是:

a.txt (系統找不到該文件。)

4. 嵌套

例如e.g.3代碼所示,finally塊中還嵌套了一個try…catch語句塊,這種在try塊、catch塊或finally塊中包含完整的異常處理流程的情形被稱為異常的嵌套。一般對嵌套深度沒有限制,但是層次太深的嵌套會降低可讀性。

5.Java7的自動關閉資源的try語句:

在java7之前,我們必須像e.g.3中的代碼一樣手動關閉文件,回收資源。在Java7中增強了try語句的功能,它允許在try關鍵字后緊跟一對圓括號,圓括號可以聲明、初始化一個或多個資源,此處的資源指的是那些必須在程序結束時顯示關閉的資源,try語句在該語句結束時自動關閉這些資源。這些資源實現類必須實現AutoCloseable或Closeable接口,實現這兩個接口就必須實現close()方法。

注:Closeable是AutoCloseable接口的子接口,Closeable接口里的close()方法聲明拋出了IOException,因此它的實現類在實現close()方法時只能聲明拋出IOException或其子類;AutoCloseable接口里的close()方法聲明拋出了Exception,因此它的實現類在實現close()方法時能拋出任何異常。Java7幾乎把所有的“資源類”(包括文件IO的各種類、JDBC編程的Connection、Statement等接口)進行了改寫,改寫后的資源類都實現了AutoCloseable或Closeable接口

e.g.4

//使用自動回收資源的try語句public class AutoCloseTest {  public static void main(String[] args) throws IOException {    try(    //聲明、初始化兩個可關閉的資源,try語句會自動關閉這兩個資源    BufferedReader br = new BufferedReader(    new FileReader("AutoCloseTest.java"));    PrintStream ps = new PrintStream(    new FileOutputStream("a.txt"))) {      //使用兩個資源      System.out.println(br.readLine());      ps.println("自動關閉資源的try語句")    }  }}

以上try語句塊后的圓括號中聲明、初始化了兩個IO流,由于BufferedReader、PrintStream都實現了Closeable接口,所以try語句會自動關閉它們。自動關閉資源的try語句塊相當于包含了隱式的finally塊用于關閉資源,這個try語句可以沒有catch塊也可以沒有finally塊,大大減少了代碼的長度。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍欧美另类| 欧美日韩亚洲国产一区| 国产成人黄色av| 亚洲伊人第一页| 深夜精品寂寞黄网站在线观看| 久久久久99精品久久久久| 久久99久久99精品中文字幕| 久久人91精品久久久久久不卡| 国产精品欧美日韩久久| 久久青草精品视频免费观看| 最近更新的2019中文字幕| 国产精品久久色| 国产精品入口夜色视频大尺度| 亚洲国产精品高清久久久| 日韩中文字幕视频| 在线看片第一页欧美| 国产精品美女久久久免费| 久久91精品国产91久久跳| 久久影视电视剧免费网站| 亚洲三级av在线| 亚洲欧美变态国产另类| 欧美激情视频在线观看| 久久久久久网站| 91精品中国老女人| 久久久久久国产精品| 亚洲国产精品va在线看黑人| 久久免费视频这里只有精品| 国产亚洲精品一区二区| 国产成人精品午夜| 成人精品久久一区二区三区| 日韩小视频网址| 欧美电影免费观看电视剧大全| 一区二区欧美亚洲| 亚洲国产精品va在线| 国产精品扒开腿做爽爽爽的视频| 欧美一级在线播放| 在线亚洲午夜片av大片| 欧美国产日韩一区二区| 欧美成人精品xxx| 亚洲视频专区在线| 久久精品99久久久香蕉| 亚洲图中文字幕| 97精品国产97久久久久久| 欧美午夜激情小视频| 91在线|亚洲| 精品视频久久久| 欧美国产视频日韩| 久久亚洲综合国产精品99麻豆精品福利| 26uuu日韩精品一区二区| 国产suv精品一区二区三区88区| 日本成人精品在线| 美日韩精品视频免费看| 最近2019中文字幕在线高清| 日韩精品在线视频观看| 久久精品91久久久久久再现| 高清欧美性猛交| 最好看的2019年中文视频| 欧美成人激情图片网| 91精品视频免费| 福利一区视频在线观看| 视频一区视频二区国产精品| 国产精品第二页| 精品国产拍在线观看| 欧美日韩性视频在线| 成人两性免费视频| 热99精品里视频精品| 欧美性xxxxxxxxx| 色偷偷偷亚洲综合网另类| 欧美成人一二三| yellow中文字幕久久| 久久久国产精品亚洲一区| 色播久久人人爽人人爽人人片视av| 亚洲一区二区三区视频| 亚洲xxxx做受欧美| 亚洲精品欧美日韩专区| 久久久久久久久久久av| 国产欧美精品一区二区三区-老狼| 91日本在线视频| 96国产粉嫩美女| 国产精品一区二区电影| 91在线中文字幕| 欧美专区日韩视频| 成人欧美一区二区三区黑人孕妇| 欧美性极品xxxx娇小| 欧美精品一区二区免费| 国产精品网址在线| 欧美一级视频免费在线观看| 欧美在线激情视频| 国产女同一区二区| 国产在线播放不卡| 日韩欧美中文在线| 久久视频国产精品免费视频在线| xvideos国产精品| 伊人久久久久久久久久久| 中文字幕不卡在线视频极品| 日韩av在线最新| 久久久久久久一| 亚洲欧美制服另类日韩| 国产有码在线一区二区视频| 亚洲国产高清福利视频| 日韩欧美有码在线| 日韩精品极品视频免费观看| 51精品在线观看| 欧美成人在线影院| 久久久久www| 亚洲a区在线视频| 中文字幕欧美精品日韩中文字幕| 日韩动漫免费观看电视剧高清| 精品中文字幕久久久久久| 中文字幕亚洲一区二区三区五十路| 色综合色综合网色综合| 亚洲欧美日韩精品| 在线日韩av观看| 国产日韩欧美视频| 国产欧美一区二区三区久久人妖| 精品久久香蕉国产线看观看亚洲| 美日韩精品免费视频| 欧美一级黑人aaaaaaa做受| 国内伊人久久久久久网站视频| 久久久久国产精品一区| 国产精品福利小视频| 日本成人激情视频| 日韩av在线网站| 国产成人精品久久二区二区91| 在线不卡国产精品| 91成人国产在线观看| 欧美裸体xxxx极品少妇软件| 亚洲一区二区三区视频播放| 最近2019中文字幕大全第二页| 在线视频国产日韩| 精品国产一区二区三区久久狼5月| 亚洲人成在线观看网站高清| 欧美激情在线有限公司| 欧美孕妇毛茸茸xxxx| 国产亚洲欧美日韩一区二区| 精品一区精品二区| 欧美成人免费全部| 亚洲尤物视频网| 成人av资源在线播放| 久久久女人电视剧免费播放下载| 国产精品福利在线观看网址| 精品国产鲁一鲁一区二区张丽| 亚洲国产精品久久精品怡红院| 中文字幕久久精品| 久久福利视频导航| 91精品免费久久久久久久久| 欧美精品videofree1080p| 欧美日韩美女在线| 亚洲黄页视频免费观看| 亚洲国产99精品国自产| 91欧美视频网站| 国产精品欧美日韩| 色综合久久88色综合天天看泰| 久久97精品久久久久久久不卡| 日韩大陆毛片av| 国产91在线播放九色快色| 高清在线视频日韩欧美| 精品久久久久久亚洲国产300| 日本不卡高字幕在线2019| 国产精品黄色影片导航在线观看| 欧美裸体男粗大视频在线观看| 97超级碰碰人国产在线观看| 亚洲sss综合天堂久久| 亚洲成人免费在线视频|