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

全面了解Java中對于異常的捕捉方法

 更新時間:2015年11月12日 16:38:32   作者:真實的歸宿  
這篇文章主要全面介紹了Java中對于異常的捕捉方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

1. try-catch語句

在Java中,異常通過try-catch語句捕獲。其一般語法形式為:

try { 
  // 可能會發(fā)生異常的程序代碼 
} catch (Type1 id1){ 
  // 捕獲并處置try拋出的異常類型Type1 
} 
catch (Type2 id2){ 
   //捕獲并處置try拋出的異常類型Type2 
}

關(guān)鍵詞try后的一對大括號將一塊可能發(fā)生異常的代碼包起來,稱為監(jiān)控區(qū)域。Java方法在運行過程中出現(xiàn)異常,則創(chuàng)建異常對象。將異常拋出監(jiān)控區(qū)域之 外,由Java運行時系統(tǒng)試圖尋找匹配的catch子句以捕獲異常。若有匹配的catch子句,則運行其異常處理代碼,try-catch語句結(jié)束。

匹配的原則是:如果拋出的異常對象屬于catch子句的異常類,或者屬于該異常類的子類,則認為生成的異常對象與catch塊捕獲的異常類型相匹配。

例1  捕捉throw語句拋出的“除數(shù)為0”異常。

public class TestException { 
  public static void main(String[] args) { 
    int a = 6; 
    int b = 0; 
    try { // try監(jiān)控區(qū)域 
        
      if (b == 0) throw new ArithmeticException(); // 通過throw語句拋出異常 
      System.out.println("a/b的值是:" + a / b); 
    } 
    catch (ArithmeticException e) { // catch捕捉異常 
      System.out.println("程序出現(xiàn)異常,變量b不能為0。"); 
    } 
    System.out.println("程序正常結(jié)束。"); 
  } 
}

運行結(jié)果:

程序出現(xiàn)異常,變量b不能為0。

程序正常結(jié)束。

例1  在try監(jiān)控區(qū)域通過if語句進行判斷,當“除數(shù)為0”的錯誤條件成立時引發(fā)ArithmeticException異常,創(chuàng)建 ArithmeticException異常對象,并由throw語句將異常拋給Java運行時系統(tǒng),由系統(tǒng)尋找匹配的異常處理器catch并運行相應(yīng)異 常處理代碼,打印輸出“程序出現(xiàn)異常,變量b不能為0?!眛ry-catch語句結(jié)束,繼續(xù)程序流程。

事實上,“除數(shù)為0”等ArithmeticException,是RuntimException的子類。而運行時異常將由運行時系統(tǒng)自動拋出,不需要使用throw語句。

例2  捕捉運行時系統(tǒng)自動拋出“除數(shù)為0”引發(fā)的ArithmeticException異常。

public static void main(String[] args) { 
    int a = 6; 
    int b = 0; 
    try { 
      System.out.println("a/b的值是:" + a / b); 
    } catch (ArithmeticException e) { 
      System.out.println("程序出現(xiàn)異常,變量b不能為0。"); 
    } 
    System.out.println("程序正常結(jié)束。"); 
  } 
}

運行結(jié)果:

程序出現(xiàn)異常,變量b不能為0。

程序正常結(jié)束。

例2  中的語句:

System.out.println(“a/b的值是:” + a/b);

在運行中出現(xiàn)“除數(shù)為0”錯誤,引發(fā)ArithmeticException異常。運行時系統(tǒng)創(chuàng)建異常對象并拋出監(jiān)控區(qū)域,轉(zhuǎn)而匹配合適的異常處理器catch,并執(zhí)行相應(yīng)的異常處理代碼。

由于檢查運行時異常的代價遠大于捕捉異常所帶來的益處,運行時異常不可查。Java編譯器允許忽略運行時異常,一個方法可以既不捕捉,也不聲明拋出運行時異常。

例3  不捕捉、也不聲明拋出運行時異常。

public class TestException { 
  public static void main(String[] args) { 
    int a, b; 
    a = 6; 
    b = 0; // 除數(shù)b 的值為0 
    System.out.println(a / b); 
  } 
}

運行結(jié)果:

Exception in thread “main” java.lang.ArithmeticException: / by zero
at Test.TestException.main(TestException.java:8)

例4  程序可能存在除數(shù)為0異常和數(shù)組下標越界異常。

public class TestException { 
  public static void main(String[] args) { 
    int[] intArray = new int[3]; 
    try { 
      for (int i = 0; i <= intArray.length; i++) { 
        intArray[i] = i; 
        System.out.println("intArray[" + i + "] = " + intArray[i]); 
        System.out.println("intArray[" + i + "]模 " + (i - 2) + "的值: " 
            + intArray[i] % (i - 2)); 
      } 
    } catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println("intArray數(shù)組下標越界異常。"); 
    } catch (ArithmeticException e) { 
      System.out.println("除數(shù)為0異常。"); 
    } 
    System.out.println("程序正常結(jié)束。"); 
  } 
}

運行結(jié)果:

intArray[0] = 0

intArray[0]模 -2的值: 0

intArray[1] = 1

intArray[1]模 -1的值: 0

intArray[2] = 2

除數(shù)為0異常。

程序正常結(jié)束。

例4  程序可能會出現(xiàn)除數(shù)為0異常,還可能會出現(xiàn)數(shù)組下標越界異常。程序運行過程中ArithmeticException異常類型是先行匹配的,因此執(zhí)行相匹配的catch語句:

catch (ArithmeticException e){ 
   System.out.println("除數(shù)為0異常。"); 
 }

需要注意的是,一旦某個catch捕獲到匹配的異常類型,將進入異常處理代碼。一經(jīng)處理結(jié)束,就意味著整個try-catch語句結(jié)束。其他的catch子句不再有匹配和捕獲異常類型的機會。

Java通過異常類描述異常類型,異常類的層次結(jié)構(gòu)如圖1所示。對于有多個catch子句的異常程序而言,應(yīng)該盡量將捕獲底層異常類的catch子 句放在前面,同時盡量將捕獲相對高層的異常類的catch子句放在后面。否則,捕獲底層異常類的catch子句將可能會被屏蔽。

RuntimeException異常類包括運行時各種常見的異常,ArithmeticException類和ArrayIndexOutOfBoundsException類都是它的子類。因此,RuntimeException異常類的catch子句應(yīng)該放在 最后面,否則可能會屏蔽其后的特定異常處理或引起編譯錯誤。

2. try-catch-finally語句

try-catch語句還可以包括第三部分,就是finally子句。它表示無論是否出現(xiàn)異常,都應(yīng)當執(zhí)行的內(nèi)容。try-catch-finally語句的一般語法形式為:

try { 
  // 可能會發(fā)生異常的程序代碼 
} catch (Type1 id1) { 
  // 捕獲并處理try拋出的異常類型Type1 
} catch (Type2 id2) { 
  // 捕獲并處理try拋出的異常類型Type2 
} finally { 
  // 無論是否發(fā)生異常,都將執(zhí)行的語句塊 
}

例5  帶finally子句的異常處理程序。

public class TestException { 
  public static void main(String args[]) { 
    int i = 0; 
    String greetings[] = { " Hello world !", " Hello World !! ", 
        " HELLO WORLD !!!" }; 
    while (i < 4) { 
      try { 
        // 特別注意循環(huán)控制變量i的設(shè)計,避免造成無限循環(huán) 
        System.out.println(greetings[i++]); 
      } catch (ArrayIndexOutOfBoundsException e) { 
        System.out.println("數(shù)組下標越界異常"); 
      } finally { 
        System.out.println("--------------------------"); 
      } 
    } 
  } 
}

運行結(jié)果:

Hello world !

————————–

Hello World !!

————————–

HELLO WORLD !!!

————————–

數(shù)組下標越界異常

————————–

在例5中,請?zhí)貏e注意try子句中語句塊的設(shè)計,如果設(shè)計為如下,將會出現(xiàn)死循環(huán)。如果設(shè)計為:

try { 
   System.out.println (greetings[i]); i++; 
}

小結(jié):

try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執(zhí)行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執(zhí)行。在以下4種特殊情況下,finally塊不會被執(zhí)行:
a.在finally語句塊中發(fā)生了異常。
b.在前面的代碼中用了System.exit()退出程序。
c.程序所在的線程死亡。
d.關(guān)閉CPU。

3. try-catch-finally 規(guī)則(異常處理語句的語法規(guī)則):

a.  必須在 try 之后添加 catch 或 finally 塊。try 塊后可同時接 catch 和 finally 塊,但至少有一個塊。
b. 必須遵循塊順序:若代碼同時使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之后。
c. catch 塊與相應(yīng)的異常類的類型相關(guān)。
d. 一個 try 塊可能有多個 catch 塊。若如此,則執(zhí)行第一個匹配塊。即Java虛擬機會把實際拋出的異常對象依次和各個catch代碼塊聲明的異常類型匹配,如果異常對象為某個異常類型或其子類的實例,就執(zhí)行這個catch代碼塊,不會再執(zhí)行其他的 catch代碼塊
e. 可嵌套 try-catch-finally 結(jié)構(gòu)。
f. 在 try-catch-finally 結(jié)構(gòu)中,可重新拋出異常。
g. 除了下列情況,總將執(zhí)行 finally 做為結(jié)束:JVM 過早終止(調(diào)用 System.exit(int));在 finally 塊中拋出一個未處理的異常;計算機斷電、失火、或遭遇病毒攻擊。

4. try、catch、finally語句塊的執(zhí)行順序:

a.當try沒有捕獲到異常時:try語句塊中的語句逐一被執(zhí)行,程序?qū)⑻^catch語句塊,執(zhí)行finally語句塊和其后的語句;

b.當try捕獲到異常,catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現(xiàn)異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執(zhí)行,但finally語句塊后的語句不會被執(zhí)行;

c.當try捕獲到異常,catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執(zhí)行的,當執(zhí)行到某一條語句出現(xiàn)異常時,程序?qū)⑻絚atch語句塊,并與catch語句塊逐一匹配,找到與之對應(yīng)的處理程序,其他的catch語句塊將不會被執(zhí)行,而try語句塊中,出現(xiàn)異常之后的語句也不會被執(zhí)行,catch語句塊執(zhí)行完后,執(zhí)行finally語句塊里的語句,最后執(zhí)行finally語句塊后的語句;

圖示try、catch、finally語句塊的執(zhí)行:

20151112163604403.jpg (600×462)

相關(guān)文章

  • Java8新特性詳解與實戰(zhàn)分享

    Java8新特性詳解與實戰(zhàn)分享

    Java 8作為Java語言的一個重要更新,引入了一系列新特性,這些特性不僅提高了代碼的可讀性和可維護性,還增強了程序的性能,本文將詳細介紹Java 8中的幾個關(guān)鍵使用技巧,并通過代碼案例來展示它們的應(yīng)用,需要的朋友可以參考下
    2024-06-06
  • Java 實現(xiàn)協(xié)程的方法

    Java 實現(xiàn)協(xié)程的方法

    這篇文章主要介紹了Java 實現(xiàn)協(xié)程的方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • Java設(shè)計模式之抽象工廠模式

    Java設(shè)計模式之抽象工廠模式

    這篇文章主要為大家詳細介紹了Java設(shè)計模式之抽象工廠模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • spring boot基于Java的容器配置講解

    spring boot基于Java的容器配置講解

    這篇文章主要介紹了spring boot基于Java的容器配置講解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java中多線程同步類 CountDownLatch

    Java中多線程同步類 CountDownLatch

    本篇文章主要介紹了Java中多線程同步類 CountDownLatch的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • Mybatis 中的一對一,一對多,多對多的配置原則示例代碼

    Mybatis 中的一對一,一對多,多對多的配置原則示例代碼

    這篇文章主要介紹了 Mybatis 中的一對一,一對多,多對多的配置原則示例代碼,需要的朋友可以參考下
    2017-03-03
  • ZooKeeper官方文檔之Java客戶端開發(fā)案例翻譯

    ZooKeeper官方文檔之Java客戶端開發(fā)案例翻譯

    網(wǎng)上有很多ZooKeeper的java客戶端例子,我也看過很多,不過大部分寫的都不好,有各種問題。兜兜轉(zhuǎn)轉(zhuǎn)還是覺得官方給的例子最為經(jīng)典,在學(xué)習(xí)之余翻譯下來,供朋友們參考
    2022-01-01
  • Java簡單實現(xiàn)動態(tài)代理模式過程解析

    Java簡單實現(xiàn)動態(tài)代理模式過程解析

    這篇文章主要介紹了Java動態(tài)代理模式簡單案例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 基于opencv+java實現(xiàn)簡單圖形識別程序

    基于opencv+java實現(xiàn)簡單圖形識別程序

    這篇文章主要給大家介紹了如何基于opencv+java實現(xiàn)簡單圖形識別程序的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • java秒殺之redis限流操作詳解

    java秒殺之redis限流操作詳解

    這篇文章主要為大家詳細介紹了java秒殺之redis限流操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

利辛县| 邻水| 太仆寺旗| 马龙县| 修武县| 金塔县| 外汇| 建昌县| 清徐县| 天镇县| 哈密市| 精河县| 阿坝县| 独山县| 舟山市| 乾安县| 凌源市| 都安| 阿鲁科尔沁旗| 红原县| 吉安市| 襄城县| 阿拉善左旗| 行唐县| 合川市| 万载县| 政和县| 台南市| 江门市| 鹿泉市| 贺州市| 临湘市| 彭泽县| 沾益县| 黔南| 连城县| 田林县| 香港| 平和县| 南安市| 富民县|