1. 程式人生 > >XF文章筆記之《Java異常》認識異常流程(一)

XF文章筆記之《Java異常》認識異常流程(一)

別名 XF
最近在看了一些改善程式碼的原則,重溫下基礎,而又不可忽視的重點區域,記錄下來。

認識異常流執行機制

異常流類似於goto語句,java中沒有goto語句,但是異常採用了類似的技術。一旦一個異常誕生,控制流(control)就會立刻轉入下面三者之一

    catch block    (捕獲區段)
    finally block  (終結區段)
    calling method (呼叫端)

選明確程式碼中出現異常時執行的順序

public class ExceptionTest {

    public static void main(
String[] args) { System.out.println("Extering main()"); ExceptionTest et = new ExceptionTest(); try { System.out.println("Calling m1()"); et.m1(); System.out.println("Returing form call to m1()"); }catch (Exception e ){ System.
out.println("Caught IOException in main()"); } System.out.println("Enterint main()"); } public void m1() throws Exception{ System.out.println("Entering m1()"); try { System.out.println("Calling m2"); m2(); System.out.println
("Returing form call to m2()"); System.out.println("Calling m3"); m3(true); }catch (Exception e){ System.out.println("Caught IOException in"+"m1()...rethrow"); throw e; }finally { System.out.println("In finally for m1()"); } System.out.println("Exiting m1()"); } private void m2() { System.out.println("Entering m2()"); try { Vector v = new Vector(5); }catch (IllegalArgumentException e){ System.out.println("Caught IllegalArgumentException in"+"m2()"); }finally { System.out.println("In finally for m2()"); } System.out.println("Exiting m2()"); } private void m3(boolean b) throws IOException{ System.out.println("Entering m3()"); try { Button b3 = new Button(); if(b){ throw new IOException(); } } finally { System.out.println("In finally for m3()"); } System.out.println("Exiting m3()"); } }

輸出結果

Extering main()
Calling m1()
Entering m1()
Calling m2
Entering m2()
In finally  for m2()
Exiting m2()
Returing form call to m2()
Calling m3
Entering m3()
In finally for m3()
Caught IOException inm1()...rethrow
In finally  for m1()
Caught IOException in main()
Enterint main()
  • 程式碼複製執行一遍就可以看出異常的執行過程
  主函式進入m1()方法,m1中包含的m3()方法丟擲異常後,會進入m1()方法的catch中,m1在往外丟擲異常,
  會進入主函式的catch中。

在try區域內丟擲異常時將會發生:
如果同時存在catch和finally區,則控制流會先轉移到catch區,在轉移到finally區
如果沒有catch區,控制流會轉移到finally。

  • 不積跬步,無以至千里 每天一點點。