最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年01月04日 11:44:10   作者:sdr_zd  
今天小編就為大家分享一篇關(guān)于Java異常處理之try...catch...finally詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

異常處理機(jī)制已經(jīng)成為判斷一門編程語言是否成熟的標(biāo)準(zhǔn)之一,其對(duì)代碼的健壯性有很大影響。一直以來異常處理使用不是很得心應(yīng)手,今天對(duì)異常進(jìn)行了較為深入的學(xué)習(xí),這篇主要是對(duì)try…catch…finally的一個(gè)總結(jié)。

一.java繼承體系

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

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

二.java異常處理機(jī)制及實(shí)現(xiàn)方法

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

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

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

e.g.1 try…catch語句塊

//功能:對(duì)輸入的兩個(gè)數(shù)進(jìn)行相除運(yùn)算
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("您輸入的兩個(gè)數(shù)相除的結(jié)果是:" + c);
    } catch(IndexOutOfBoundsException ie) {
      System.out.println("數(shù)組越界");
    } catch(NumberFormatException ne) {
      System.out.println("數(shù)字格式異常");
    } catch(ArithmeticException ae) {
      System.out.println("算術(shù)異常");
    } catch(Exception e) {
      System.out.println("未知異常");
    } 
  }
}

以上代碼我們看到,對(duì)不同的異常情況作了不同的處理:輸入?yún)?shù)不夠會(huì)發(fā)生數(shù)組越界異常、輸入?yún)?shù)不是數(shù)字發(fā)生數(shù)字格式異常、若輸入第二個(gè)數(shù)是0,則發(fā)生除0異常,調(diào)用算術(shù)異常進(jìn)行處理、出現(xiàn)其他異常時(shí)那么該異常對(duì)象必定是Exception類或其子類的實(shí)例,java調(diào)用Exception類對(duì)其進(jìn)行處理,前三種異常類均是RuntimeException的子類。在使用try…catch語句塊時(shí)需要知道或注意以下幾點(diǎn):

1) 處理過程:代碼在執(zhí)行的時(shí)候,進(jìn)入try塊,若是在try塊中出現(xiàn)了異常,系統(tǒng)會(huì)自動(dòng)生成一個(gè)一場(chǎng)對(duì)象,該對(duì)象被提交給java運(yùn)行時(shí)環(huán)境,這就是異常的拋出;在java運(yùn)行時(shí)環(huán)境收到異常對(duì)象時(shí)則把該對(duì)象交給catch塊處理,這個(gè)過程叫做異常的捕獲;若找到相應(yīng)的catch塊就執(zhí)行catch塊中的代碼,若沒有找到,則運(yùn)行時(shí)環(huán)境終止,程序也退出。

2) 執(zhí)行一次try塊只執(zhí)行一個(gè)catch塊

3) 有多個(gè)catch塊并有繼承關(guān)系的情況下必須先寫子類后寫父類(即先捕獲小異常再捕獲大異常),若寫反在編譯時(shí)就會(huì)報(bào)錯(cuò)

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

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

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

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("您輸入的兩個(gè)數(shù)相除的結(jié)果是:" + c);
    } catch(IndexOutOfBoundsException|NumberFormatException|
    ArithmeticException ie) {
      System.out.println("數(shù)組越界或數(shù)字格式異常或算術(shù)異常");
      ie = new ArithmeticExcrption("test");  //①
    } catch(Exception e) {
      System.out.println("未知異常");
      e = new RuntimeException("test");  //②
    } 
  }
}

可以看出,以上代碼中,①號(hào)代碼是錯(cuò)誤的,因?yàn)閕e是被final隱式修飾的對(duì)象,②號(hào)代碼是正確的

3. 使用finally回收資源:有些時(shí)候我們?cè)趖ry塊中打開了一些物理資源(例如數(shù)據(jù)庫鏈接、網(wǎng)絡(luò)連接和磁盤文件等),這些資源都應(yīng)進(jìn)行顯示回收。有人說java不是有垃圾回收機(jī)制嗎?java的垃圾回收機(jī)制是自動(dòng)回收堆內(nèi)存中對(duì)象所占用的內(nèi)存,而物理資源是不會(huì)自動(dòng)回收的。

finally重點(diǎn)學(xué)習(xí)以下幾點(diǎn):

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

e.g.3

//該類功能:打開a.txt文件,在finally塊中對(duì)資源進(jìn)行回收
/* 對(duì)代碼中一些方法的解釋:
 * 所有異常都包含以下幾種訪問異常信息的常用方法:
 * getMessage():返回該異常的詳細(xì)描述字符串
 * printStackTrace():將該異常的跟蹤棧信息輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出
 * printStaceTrace(PrintStack s):將該異常的跟蹤棧信息到執(zhí)行輸出流
 * 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("執(zhí)行finally塊里的資源回收!");
    }
  }
}

注釋掉②號(hào)代碼運(yùn)行以上程序,我們看到的結(jié)果是:

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

注釋掉①號(hào)代碼運(yùn)行以上程序,我們看到的結(jié)果是:

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

4. 嵌套

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

5.Java7的自動(dòng)關(guān)閉資源的try語句:

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

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

e.g.4

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

以上try語句塊后的圓括號(hào)中聲明、初始化了兩個(gè)IO流,由于BufferedReader、PrintStream都實(shí)現(xiàn)了Closeable接口,所以try語句會(huì)自動(dòng)關(guān)閉它們。自動(dòng)關(guān)閉資源的try語句塊相當(dāng)于包含了隱式的finally塊用于關(guān)閉資源,這個(gè)try語句可以沒有catch塊也可以沒有finally塊,大大減少了代碼的長度。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • springboot項(xiàng)目集成swagger-bootstrap-ui全過程

    springboot項(xiàng)目集成swagger-bootstrap-ui全過程

    這篇文章主要介紹了springboot項(xiàng)目集成swagger-bootstrap-ui全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java多線程編程制作電子時(shí)鐘

    java多線程編程制作電子時(shí)鐘

    本文給大家匯總了幾個(gè)使用java多線程編程實(shí)現(xiàn)的電子時(shí)鐘的代碼,思路非常的巧妙,也都很實(shí)用,有需要的小伙伴可以參考下。
    2015-11-11
  • 關(guān)于Lombok @Data注解:簡化Java代碼的魔法棒

    關(guān)于Lombok @Data注解:簡化Java代碼的魔法棒

    Lombok庫通過@Data注解自動(dòng)生成常見的樣板代碼如getter、setter、toString等,極大減少代碼量,提高開發(fā)效率,@Data注解集成了@ToString、@EqualsAndHashCode、@Getter、@Setter、@RequiredArgsConstructor等注解的功能
    2024-10-10
  • 半小時(shí)實(shí)現(xiàn)Java手?jǐn)]網(wǎng)絡(luò)爬蟲框架(附完整源碼)

    半小時(shí)實(shí)現(xiàn)Java手?jǐn)]網(wǎng)絡(luò)爬蟲框架(附完整源碼)

    最近在做一個(gè)搜索相關(guān)的項(xiàng)目,需要爬取網(wǎng)絡(luò)上的一些鏈接存儲(chǔ)到索引庫中,自己寫了一個(gè)簡單的網(wǎng)絡(luò)爬蟲,感興趣的可以了解一下
    2021-06-06
  • Spring中的InitializingBean接口的使用

    Spring中的InitializingBean接口的使用

    這篇文章主要介紹了Spring中的InitializingBean接口的使用,需要的朋友可以參考下
    2018-04-04
  • SpringBoot使用@Scheduled定時(shí)器的示例詳解

    SpringBoot使用@Scheduled定時(shí)器的示例詳解

    SpringBoot的@Scheduled注解用于配置定時(shí)任務(wù),需啟用@EnableScheduling,支持fixedRate、fixedDelay、cron等參數(shù),控制執(zhí)行頻率、延遲及周期,支持線程池和異常處理配置,默認(rèn)單線程串行執(zhí)行,本文介紹SpringBoot使用@Scheduled定時(shí)器的操作示例,感興趣的朋友一起看看吧
    2025-07-07
  • Eclipse+Maven構(gòu)建Hadoop項(xiàng)目的方法步驟

    Eclipse+Maven構(gòu)建Hadoop項(xiàng)目的方法步驟

    這篇文章主要介紹了Eclipse+Maven構(gòu)建Hadoop項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Spring Boot 的注解生效詳細(xì)步驟解析

    Spring Boot 的注解生效詳細(xì)步驟解析

    Spring通過掃描、解析、注冊(cè)分層處理配置類注解(如@Configuration、@ComponentScan等),利用遞歸、延遲加載和緩存機(jī)制,實(shí)現(xiàn)BeanDefinition的動(dòng)態(tài)注冊(cè)與靈活擴(kuò)展,解決依賴和性能問題,本文給大家介紹Spring Boot的注解生效詳細(xì)步驟解析,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • java 基于maven多模塊合并打包部署的操作過程

    java 基于maven多模塊合并打包部署的操作過程

    這篇文章主要介紹了java 基于maven多模塊合并打包部署的操作過程,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Java+opencv3.2.0實(shí)現(xiàn)模板匹配

    Java+opencv3.2.0實(shí)現(xiàn)模板匹配

    這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)模板匹配的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評(píng)論

永州市| 东乡县| 上饶县| 蚌埠市| 巴彦县| 双柏县| 平谷区| 霍林郭勒市| 长顺县| 自贡市| 青川县| 韩城市| 远安县| 吉首市| 江安县| 双鸭山市| 沂水县| 湘阴县| 福州市| 蓝田县| 图片| 色达县| 珲春市| 汤原县| 梓潼县| 拜城县| 西青区| 崇明县| 左贡县| 雅江县| 苏尼特左旗| 高邮市| 吉安县| 郑州市| 合江县| 五华县| 建德市| 怀安县| 七台河市| 凌源市| 手游|