finally塊與拋異常

2021-08-20 07:40:44 字數 2090 閱讀 6666

複習一下finally塊裡有return和try拋異常的程式執行順序問題.

首先看乙個測試例子:

public class finallytrytest 

public static int testfinally()catch(exception e)

finally }}

在執行之前先簡單分析一下,可能會說這麼簡單,不是一眼就看出來了嗎?結果如下:

測試異常

finally塊被執行

可能會說,比較容易,執行順序不就是先try->catch->finally->return 結束方法->輸出count的值嗎?

說明一點:如果finally塊裡面有return語句會導致方法結束的,不會再次跳回try塊,catch塊裡面執行任何**了的.

下面的例子先看一下:

public class finallytrytest 

public static int testfinally()

finally }}

就是把catch塊給去掉了的.猜一下程式的執行結果吧.想一想該程式的執行過程是怎樣的?

首先:每個try塊至少對應乙個catch塊或者是乙個finally塊,不能能是只有唯一的乙個try塊的.上述程式滿足不會報編譯錯誤的.

接下來在分析執行的結果會是什麼樣的?猜測的依據是什麼?該程式的執行過程又是什麼?不妨看一下.

1:會報異常沒有輸出結果.

2:報異常有輸出結果.

3:沒報異常,程式正常輸出.

正確的答案是3號.

有圖有真相

如何驗證猜想的每一步的執行過程吶?那就debug吧.下面是分別每一步的debug的執行過程的截圖.紅色箭頭表示執行到那一行.

至此完成所有程式的執行過程.看到非常直觀的結論throw語句完全失去了作用.

實驗完成了總結一下吧.

不論try塊是正常結束,還是非正常中途退出,finally塊其實都會執行的.(這裡說明一點try塊根本就沒有結束它的執行過程,如果要是通過system.exit(0)將停止當前執行緒和已經死亡的執行緒,finally塊難道能讓已經停止的執行緒繼續嗎?當然不能能啦.)

執行流程,當程式執行try塊,catch塊時遇到throw語句的時候,try塊就檢查該異常處理流程裡面是否包含finally塊,如果沒有,那就是相應的catch塊那就捕獲這個異常.如果有finally塊,並且有catch塊捕獲就會先捕獲這個異常,再開始執行finally塊.如果只有finally塊(沒有相應的catch塊捕獲該異常)只有當finally塊執行完成後,系統才會再次跳回來丟擲異常的.如果finaly塊裡使用return語句就結束了方法.就不會再次跳回try塊裡面的.

catch塊裡面含有return語句,不會立即結束當前的方法的,會先檢查是否有finally塊的.如果有就會執行的.如果finally塊裡面有return語句就會結束方法的.這個時候就真的結束了,不會在執行其他的塊裡面的**的.

通過debug可以清楚的看到執行的過程.勝於理論概念(萬一理論分析出現偏差).

物件導向 異常finally

finally 塊 定義一定執行的 通常用於關閉資源。class fushuexception extends exception class demo class exceptiondemo5 catch fushuexception e finally system.out.println ov...

iOS斷言 拋異常

自定義描述異常資訊的desc就是所謂的拋異常 注意 assert是乙個巨集,只在debug版本中起作用,在release版本中,該語句是不起任何作用的。示例一 給label屬性賦值不能為空,新增斷言,如果為空,則直接crash,拋異常 import mainviewcontroller.h inte...

finally最終執行塊和throw與throws

如果你在寫try catch的時候需要一段 不管出現錯誤或者不出現錯誤,都執行這段 的話,就在最後面加上 finally 最終執行塊,而且這個 finally 要寫在最後面,並且乙個 try catch 只能寫乙個 finally finally 後面不可以再寫 catch 例如 可以看到出現了異常...