try-catch-finally塊的執行流程
阿新 • • 發佈:2019-02-02
記得前些天看try-catch-finally的東西,在很多部落格上看了很多文章,也沒有理解的很透徹,今天看到了國外的一個牛人講的,感覺非常好非常透徹,完全沒有云裡霧裡的感覺,就把它翻譯過來。
在這篇文中我們來看一下怎麼使用try-catch-finally塊來進行異常處理,在看這個之前可以先看一下try-catch
try-catch塊的流程控制
當異常不發生的時候:
當在try塊中的語句沒有丟擲異常的時候,catch永遠不會被執行。
例如:
..... int x = 10; int y = 10; try{ int num= x/y; System.out.println("next-statement: Inside try block"); }catch(Exception ex) { System.out.println("Exception"); } System.out.println("next-statement: Outside of try-catch"); ...
輸出結果:
next-statement: Inside try block
next-statement: Outside of try-catch
上邊的例子中沒有異常發生,所以catch沒有執行
當異常發生的情況:
int x = 0; int y = 10; try{ int num= y/x; System.out.println("next-statement: Inside try block"); }catch(Exception ex) { System.out.println("Exception Occurred"); } System.out.println("next-statement: Outside of try-catch"); ...
輸出結果:
Exception Occurred
next-statement: Outside of try-catch
在上邊的例子中,有兩條語句在try塊中,因為異常發生在第一條語句中,所以第二條語句沒有被執行,因此我們可以總結:一旦異常發生try塊中剩下的語句不會被執行同時執行控制也被傳遞到catch塊中。
try/catch/finally塊的流程控制:
1、如果在try塊中發生異常那麼控制會立刻被傳遞(跳過try塊中的剩下的其他語句)到catch中去。一旦catch塊執行完成之後finally塊和其後的程式執行
2、如果在程式碼中沒有異常發生,try塊中的程式碼會被完全執行,然後執行控制被傳遞到(跳過catch塊)finally塊中
3、如果在catch或者try塊中有return語句,在這種情況下,finally也會執行,控制流是:先執行finally然後回到return語句。
考慮下邊的程式碼理解上邊的觀點:
class TestExceptions {
static void myMethod(int testnum) throws Exception {
System.out.println ("start - myMethod");
if (testnum == 12)
throw new Exception();
System.out.println("end - myMethod");
return;
}
public static void main(String args[]) {
int testnum = 12;
try {
System.out.println("try - first statement");
myMethod(testnum);
System.out.println("try - last statement");
}
catch ( Exception ex) {
System.out.println("An Exception");
}
finally {
System. out. println( "finally") ;
}
System.out.println("Out of try/catch/finally - statement");
}
}
輸出結果:
try - first statement
start - myMethod
An Exception
finally
Out of try/catch/finally - statement
關於return和finally誰先返回的問題,請看這篇文章,點選
原文地址:http://beginnersbook.com/2013/05/flow-in-try-catch-finally/