解析Java中未被捕捉的異常和try語句的嵌套應用。本站提示廣大學習愛好者:(解析Java中未被捕捉的異常和try語句的嵌套應用)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Java中未被捕捉的異常和try語句的嵌套應用正文
Java未被捕捉的異常
在你進修在法式中處置異常之前,看一看假如你不處置它們會有甚麼情形產生是很有利益的。上面的小法式包含一個有意招致被零除毛病的表達式。
class Exc0 { public static void main(String args[]) { int d = 0; int a = 42 / d; } }
當Java運轉時體系檢討到被零除的情形,它結構一個新的異常對象然後拋出該異常。這招致Exc0的履行停滯,由於一旦一個異常被拋出,它必需被一個異常處置法式捕捉而且被立刻處置。該例中,我們沒有供給任何我們本身的異常處置法式,所以異常被Java運轉時體系的默許處置法式捕捉。任何不是被你法式捕捉的異常終究都邑被該默許處置法式處置。默許處置法式顯示一個描寫異常的字符串,打印異常產生處的客棧軌跡而且終止法式。
上面是由尺度javaJDK運轉時說明器履行該法式所發生的輸入:
java.lang.ArithmeticException: / by zero at Exc0.main(Exc0.java:4)
留意,類名Exc0,辦法名main,文件名Exc0.java和行數4是如何被包含在一個簡略的客棧應用軌跡中的。還有,留意拋出的異常類型是Exception的一個名為ArithmeticException的子類,該子類更明白的描寫了何品種型的毛病辦法。本章前面部門將評論辯論,Java供給多個內置的與能夠發生的分歧品種運轉時毛病相婚配的異常類型。
客棧軌跡將顯示招致毛病發生的辦法挪用序列。例如,上面是後面法式的另外一個版本,它引見了雷同的毛病,然則毛病是在main( )辦法以外的另外一個辦法中發生的:
class Exc1 { static void subroutine() { int d = 0; int a = 10 / d; } public static void main(String args[]) { Exc1.subroutine(); } }
默許異常處置器的客棧軌跡成果注解了全部挪用棧是如何顯示的:
java.lang.ArithmeticException: / by zero at Exc1.subroutine(Exc1.java:4) at Exc1.main(Exc1.java:7)
如你所見,棧底是main的第7行,該行挪用了subroutine( )辦法。該辦法在第4行招致了異常。挪用客棧關於調試來講是很主要的,由於它查清楚明了招致毛病的准確的步調。
Java try語句的嵌套
Try語句可以被嵌套。也就是說,一個try語句可以在另外一個try塊外部。每次進入try語句,異常的前後關系都邑被推入客棧。假如一個外部的try語句不含特別異常的catch處置法式,客棧將彈出,下一個try語句的catch處置法式將檢討能否與之婚配。這個進程將持續直到一個catch語句婚配勝利,或許是直到一切的嵌套try語句被檢討耗盡。假如沒有catch語句婚配,Java的運轉時體系將處置這個異常。上面是應用嵌套try語句的一個例子:
// An example of nested try statements. class NestTry { public static void main(String args[]) { try { int a = args.length; /* If no command-line args are present,the following statement will generate a divide-by-zero exception. */ int b = 42 / a; System.out.println("a = " + a); try { // nested try block /* If one command-line arg is used,then a divide-by-zero exception will be generated by the following code. */ if(a==1) a = a/(a-a); // division by zero /* If two command-line args are used,then generate an out-of-bounds exception. */ if(a==2) { int c[] = { 1 }; c[42] = 99; // generate an out-of-bounds exception } } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Array index out-of-bounds: " + e); } } catch(ArithmeticException e) { System.out.println("Divide by 0: " + e); } } }
如你所見,該法式在一個try塊中嵌套了另外一個try塊。法式任務以下:當你在沒有敕令行參數的情形下履行該法式,裡面的try塊將發生一個被零除的異常。法式在有一個敕令行參數前提下履行,由嵌套的try塊發生一個被零除的毛病。由於外部的塊不婚配這個異常,它將把異常傳給內部的try塊,在那邊異常被處置。假如你在具有兩個敕令行參數的前提下履行該法式,由外部try塊發生一個數組界限異常。上面的成果論述了每種情形:
C:\>java NestTry Divide by 0: java.lang.ArithmeticException: / by zero C:\>java NestTry One a = 1 Divide by 0: java.lang.ArithmeticException: / by zero C:\>java NestTry One Two a = 2 Array index out-of-bounds: java.lang.ArrayIndexOutOfBoundsException
當無方法挪用時,try語句的嵌套可以很隱藏的產生。例如,你可以把對辦法的挪用放在一個try塊中。在該辦法外部,有另外一個try語句。這類情形下,辦法外部的try依然是嵌套在內部挪用該辦法的try塊中的。上面是後面例子的修正,嵌套的try塊移到了辦法nesttry( )的外部:
/* Try statements can be implicitly nested via calls to methods. */ class MethNestTry { static void nesttry(int a) { try { // nested try block /* If one command-line arg is used,then a divide-by-zero exception will be generated by the following code. */ if(a==1) a = a/(a-a); // division by zero /* If two command-line args are used,then generate an out-of-bounds exception. */ if(a==2) { int c[] = { 1 }; c[42] = 99; // generate an out-of-bounds exception } } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Array index out-of-bounds: " + e); } } public static void main(String args[]) { try { int a = args.length; /* If no command-line args are present,the following statement will generate a divide-by-zero exception. */ int b = 42 / a; System.out.println("a = " + a); nesttry(a); } catch(ArithmeticException e) { System.out.println("Divide by 0: " + e); } } }
該法式的輸入與後面的例子雷同。