Java中異常處置之try和catch代碼塊的應用。本站提示廣大學習愛好者:(Java中異常處置之try和catch代碼塊的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中異常處置之try和catch代碼塊的應用正文
Java try和catch的應用
雖然由Java運轉時體系供給的默許異常處置法式關於調試是很有效的,但平日你願望本身處置異常。如許做有兩個利益。第一,它許可你修改毛病。第二,它避免法式主動終止。年夜多半用戶關於在法式終止運轉和在不管什麼時候毛病產生都邑打印客棧軌跡覺得很懊惱(至多可以這麼說)。榮幸的是,這很輕易防止。
為避免和處置一個運轉時毛病,只須要把你所要監控的代碼放進一個try塊便可以了。緊隨著try塊的,包含一個解釋你願望捕捉的毛病類型的catch子句。完成這個義務很簡略,上面的法式包括一個處置由於被零除而發生的ArithmeticException 異常的try塊和一個catch子句。
class Exc2 { public static void main(String args[]) { int d, a; try { // monitor a block of code. d = 0; a = 42 / d; System.out.println("This will not be printed."); } catch (ArithmeticException e) { // catch divide-by-zero error System.out.println("Division by zero."); } System.out.println("After catch statement."); } }
該法式輸入以下:
Division by zero. After catch statement.
留意在try塊中的對println( )的挪用是永久不會履行的。一旦異常被激發,法式掌握由try塊轉到catch塊。履行永久不會從catch塊“前往”到try塊。是以,“This will not be printed。”
將不會被顯示。一旦履行了catch語句,法式掌握從全部try/catch機制的上面一行持續。
一個try和它的catch語句構成了一個單位。catch子句的規模限制於try語句後面所界說的語句。一個catch語句不克不及捕捉另外一個try聲明所激發的異常(除非是嵌套的try語句情形)。
被try掩護的語句聲明必需在一個年夜括號以內(也就是說,它們必需在一個塊中)。你不克不及零丁應用try。
結構catch子句的目標是處理異常情形而且像毛病沒有產生一樣持續運轉。例如,上面的法式中,每個for輪回的重復獲得兩個隨機整數。這兩個整數分離被對方除,成果用來除12345。最初的成果存在a中。假如一個除法操作招致被零除毛病,它將被捕捉,a的值設為零,法式持續運轉。
// Handle an exception and move on. import java.util.Random; class HandleError { public static void main(String args[]) { int a=0, b=0, c=0; Random r = new Random(); for(int i=0; i<32000; i++) { try { b = r.nextInt(); c = r.nextInt(); a = 12345 / (b/c); } catch (ArithmeticException e) { System.out.println("Division by zero."); a = 0; // set a to zero and continue } System.out.println("a: " + a); } } }
顯示一個異常的描寫
Throwable重載toString( )辦法(由Object界說),所以它前往一個包括異常描寫的字符串。你可以經由過程在println( )中傳給異常一個參數來顯示該異常的描寫。例如,後面法式的catch塊可以被重寫成
catch (ArithmeticException e) { System.out.println("Exception: " + e); a = 0; // set a to zero and continue }
當這個版本取代原法式中的版本,法式在尺度javaJDK說明器下運轉,每個被零除毛病顯示上面的新聞:
Exception: java.lang.ArithmeticException: / by zero
雖然在高低文中沒有特別的值,顯示一個異常描寫的才能在其他情形下是很有價值的——特殊是當你對異常停止試驗和調試時。
Java 多重catch語句的應用
某些情形,由單個代碼段能夠惹起多個異常。處置這類情形,你可以界說兩個或更多的catch子句,每一個子句捕捉一品種型的異常。當異常被激發時,每個catch子句被順次檢討,第一個婚配異常類型的子句履行。當一個catch語句履行今後,其他的子句被旁路,履行從try/catch塊今後的代碼開端持續。上面的例子設計了兩種分歧的異常類型:
// Demonstrate multiple catch statements. class MultiCatch { public static void main(String args[]) { try { int a = args.length; System.out.println("a = " + a); int b = 42 / a; int c[] = { 1 }; c[42] = 99; } catch(ArithmeticException e) { System.out.println("Divide by 0: " + e); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Array index oob: " + e); } System.out.println("After try/catch blocks."); } }
該法式在沒有敕令行參數的肇端前提下運轉招致被零除異常,由於a為0。假如你供給一個敕令行參數,它將幸免於難,把a設成年夜於零的數值。然則它將招致ArrayIndexOutOf BoundsException異常,由於整型數組c的長度為1,而法式試圖給c[42]賦值。
上面是運轉在兩種分歧情形下法式的輸入:
C:\>java MultiCatch a = 0 Divide by 0: java.lang.ArithmeticException: / by zero After try/catch blocks. C:\>java MultiCatch TestArg a = 1 Array index oob: java.lang.ArrayIndexOutOfBoundsException After try/catch blocks.
當你用多catch語句時,記住異常子類必需在它們任何父類之前應用是很主要的。這是由於應用父類的catch語句將捕捉該類型及其一切子類類型的異常。如許,假如子類在父類前面,子類將永久不會達到。並且,Java中不克不及達到的代碼是一個毛病。例如,斟酌上面的法式:
/* This program contains an error. A subclass must come before its superclass in a series of catch statements. If not,unreachable code will be created and acompile-time error will result. */ class SuperSubCatch { public static void main(String args[]) { try { int a = 0; int b = 42 / a; } catch(Exception e) { System.out.println("Generic Exception catch."); } /* This catch is never reached because ArithmeticException is a subclass of Exception. */ catch(ArithmeticException e) { // ERROR - unreachable System.out.println("This is never reached."); } } }
假如你試著編譯該法式,你會收到一個毛病新聞,該毛病新聞解釋第二個catch語句不會達到,由於該異常曾經被捕捉。由於ArithmeticException 是Exception的子類,第一個catch語句將處置一切的面向Exception的毛病,包含ArithmeticException。這意味著第二個catch語句永久不會履行。為修正法式,倒置兩個catch語句的順序。