複習一下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 例如 可以看到出現了異常...