国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 14:51:22
字體:
供稿:網(wǎng)友

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語句進行判斷,當(dāng)“除數(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 zeroat 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] = 0intArray[0]模 -2的值: 0intArray[1] = 1intArray[1]模 -1的值: 0intArray[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)當(dā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 !――――――――

主站蜘蛛池模板:
闽清县|
佳木斯市|
博爱县|
宜都市|
大渡口区|
青龙|
河东区|
台南县|
江源县|
清远市|
隆安县|
沙田区|
吐鲁番市|
咸宁市|
石棉县|
江津市|
泊头市|
闻喜县|
南溪县|
灯塔市|
黑河市|
太康县|
筠连县|
调兵山市|
浑源县|
宜黄县|
新密市|
康马县|
澜沧|
蓬安县|
喀什市|
且末县|
禄丰县|
岱山县|
东海县|
鄂伦春自治旗|
永川市|
宜宾县|
柞水县|
锡林浩特市|
衡水市|