課件中動手動腦5
阿新 • • 發佈:2018-11-11
(1)多層的異常捕獲1:
原始碼:
public class catch1 { public static void main(String[] args) { // TODO Auto-generated method stub try { try { throw new ArrayIndexOutOfBoundsException(); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("ArrayIndexOutOfBoundsException" + "/內層try-catch"); } throw new ArithmeticException(); } catch(ArithmeticException e) { System.out.println("發生ArithmeticException"); } catch(ArrayIndexOutOfBoundsException e) { System.out.println( "ArrayIndexOutOfBoundsException" + "/外層try-catch"); } } }
執行結果:
我對原始碼及執行結果的理解:
內層的try丟擲ArrayIndexOutOfBoundsException異常然後被內層的catch捕捉,並輸出結果中的第一行,然後異常因為被捕捉,繼續執行外層try中的語句,丟擲了ArithmeticException異常,被外層的catch語句捕捉後輸出結果中的第二行。
(1)多層的異常捕獲2
原始碼:
public class catch2 { public static void main(String[] args) { // TODO Auto-generated method stub try{ try { throw new ArrayIndexOutOfBoundsException(); } catch(ArithmeticException e) { System.out.println( "ArrayIndexOutOfBoundsException" + "/內層try-catch"); } throw new ArithmeticException(); } catch(ArithmeticException e) { System.out.println("發生ArithmeticException"); } catch(ArrayIndexOutOfBoundsException e) { System.out.println( "ArrayIndexOutOfBoundsException" + "/外層try-catch"); } } }
執行結果:
我對原始碼及執行結果的理解:
內層的try中丟擲了異常ArrayIndexOutOfBoundsException,在內層的catch中沒有辦法捕捉,就跳出了外層的try,被外層的catch捕捉,此時外層的try語句中還有沒有被執行的則直接跳過繼續向下執行。
(1)finally執行機制:
原始碼:
public class finally1 { public static void main(String[] args) { int result; try { System.out.println("in Level 1"); try { System.out.println("in Level 2"); result=100/0; //Level 2 try { System.out.println("in Level 3"); //result=100/0; //Level 3 } catch (Exception e) { System.out.println("Level 3:" + e.getClass().toString()); } finally { System.out.println("In Level 3 finally"); } // result=100/0; //Level 2 } catch (Exception e) { System.out.println("Level 2:" + e.getClass().toString()); } finally { System.out.println("In Level 2 finally"); } // result = 100 / 0; //level 1 } catch (Exception e) { System.out.println("Level 1:" + e.getClass().toString()); } finally { System.out.println("In Level 1 finally"); } } }
執行結果:
我對原始碼及執行結果的理解:
在多層的try。。Catch()。。Finally執行時,某一層有錯誤被丟擲後,該錯誤只能被本層或者外層的catch所捕捉,也就意味著該錯誤一旦出現,在其之後的所有語句不會被執行,直到其被本層或者更外層的catch所捕捉,該catch之後的語句才能被執行,也就是隻有該catch所在的那一層以及更外層的finally語句才能被執行。
(4)finally語句塊一定會執行嗎?
public class finally2 { public static void main(String[] args) { // TODO Auto-generated method stub try{ System.out.println("in main"); throw new Exception("Exception is thrown in main"); //System.exit(0); } catch(Exception e) { System.out.println(e.getMessage()); System.exit(0); } finally { System.out.println("in finally"); } } }
執行結果:
我對原始碼及執行結果的理解:
在執行catch()語句時,呼叫了System的exit(int)方法正常退出,程式就終止了,就不會執行下面的finally語句,所以finally雖用來殿後但並不必須執行。