Java異常處理(try、catch、finally使用)

直接上代碼,先貼下面測試須要調用的方法:java

public static void enterTryMethod() {  
    System.out.println("enter after try field");  
}  
  
public static void enterExceptionMethod() {  
    System.out.println("enter catch field");  
}  
  
public static void enterFinallyMethod() {  
    System.out.println("enter finally method");  
}

1. 拋出Exception,沒有finally,當catch趕上returnweb

public static int catchTest() {  
    int res = 0;  
      
    try {  
        res = 10 / 0; // 拋出Exception,後續處理被拒絕  
        enterTryMethod();  
        return res; // Exception已經拋出,沒有得到被執行的機會  
    } catch (Exception e) {  
        enterExceptionMethod();  
        return 1;   // Exception拋出,得到了調用方法並返回方法值的機會  
    }  
}

後臺輸出結果:測試

enter catch field  
1

2. 拋出Exception,當catch體裏有return,finally體的代碼塊將在catch執行return以前被執行spa

public static int catchTest() {  
    int res = 0;  
      
    try {  
        res = 10 / 0; // 拋出Exception,後續處理被拒絕  
        enterTryMethod();  
        return res; // Exception已經拋出,沒有得到被執行的機會  
    } catch (Exception e) {  
        enterExceptionMethod();  
        return 1;   // Exception拋出,得到了調用方法並返回方法值的機會  
    } finally {  
        enterFinallyMethod(); // Exception拋出,finally代碼將在catch執行return以前被執行  
    }  
}

後臺輸出結果:code

enter catch field  
enter finally method  
1

3. 不拋出Exception,當finally代碼塊裏面趕上return,finally執行完後將結束整個方法orm

public static int catchTest() {  
    int res = 0;  
      
    try {  
        res = 10 / 2; // 不拋出Exception  
        enterTryMethod();  
        return res; // 得到被執行的機會,但執行須要在finally執行完成以後才能被執行  
    } catch (Exception e) {  
        enterExceptionMethod();  
        return 1;  
    } finally {  
        enterFinallyMethod();  
        return 1000; // finally中含有return語句,這個return將結束這個方法,不會在執行完以後再跳回try或者catch繼續執行,方法到此結束  
    }  
}

後臺輸出結果:it

enter after try field  
enter finally method  
1000

4. 不拋Exception,當finally代碼塊裏面趕上System.exit()方法將結束和終止整個程序,而不僅是方法io

public static int catchTest() {  
    int res = 0;  
      
    try {  
        res = 10 / 2; // 不拋出Exception  
        enterTryMethod();  
        return res; // 得到被執行的機會,但因爲finally已經終止程序,返回值沒有機會被返回  
    } catch (Exception e) {  
        enterExceptionMethod();  
        return 1;  
    } finally {  
        enterFinallyMethod();  
        System.exit(0); // finally中含有System.exit()語句,System.exit()將退出整個程序,程序將被終止  
    }  
}

後臺輸出結果:class

enter after try field  
enter finally method

5. 拋出Exception,當catch和finally同時趕上return,catch的return返回值將不會被返回,finally的return語句將結束整個方法並返回import

public static int catchTest() {  
    int res = 0;  
      
    try {  
        res = 10 / 0; // 拋出Exception,後續處理將被拒絕  
        enterTryMethod();  
        return res; // Exception已經拋出,沒有得到被執行的機會  
    } catch (Exception e) {  
        enterExceptionMethod();  
        return 1; // Exception已經拋出,得到被執行的機會,但返回操做將被finally截斷  
    } finally {  
        enterFinallyMethod();  
        return 10;  // return將結束整個方法,返回值爲10  
    }  
}

後臺輸出結果:

enter catch field  
enter finally method  
10

6. 不拋出Exception,當finally趕上return,try的return返回值將不會被返回,finally的return語句將結束整個方法並返回

public static int catchTest() {  
    int res = 0;  
      
    try {  
        res = 10 / 2; // 不拋出Exception  
        enterTryMethod();  
        return res; // 得到執行機會,但返回將被finally截斷  
    } catch (Exception e) {  
        enterExceptionMethod();  
        return 1;  
    } finally {  
        enterFinallyMethod();  
        return 10;  // return將結束整個方法,返回值爲10  
    }  
}

後臺輸出結果:

enter after try field  
enter finally method  
10

 

結論

Java的異常處理中,程序執行完try裏面的代碼塊以後,該方法並不會當即結束,而是繼續試圖去尋找該方法有沒有finally的代碼塊

  • 若是沒有finally代碼塊,整個方法在執行完try代碼塊後返回相應的值來結束整個方法

  • 若是有finally代碼塊,此時程序執行到try代碼塊裏的return一句之時並不會當即執行return,而是先去執行finally代碼塊裏的代碼

若finally代碼塊裏沒有return或沒有可以終止程序的代碼,程序在執行完finally代碼塊代碼以後再返回try代碼塊執行return語句來結束整個方法。若 finally 代碼塊裏有 return 或含有可以終止程序的代碼,方法將在執行完 finally 以後被結束,再也不跳回 try 代碼塊執行 return

在拋出異常的狀況下,原理也是和上面的同樣的,你把上面說到的 try 換成 catch 去理解就OK了。

相關文章
相關標籤/搜索