先來看一個小程序:java
public class JavaException { public static void main(String[] args) { System.out.println(test()); } public static int test() { int i=0; try { i = 1/0;//拋出非受檢異常 i=100; System.out.println("in try 拋出異常後不會執行到這裏!"); } catch(Exception e) { i=1; System.out.println("in catch i="+i); return i; //註釋1 } finally { i=2; System.out.println("in finally i="+i); } i=3; return i; } }
首先來思考一個問題,當咱們把註釋1那一行也就是catch中的return 語句註釋掉和不註釋掉程序的輸出最後的返回結果分別是什麼?數據庫
若是不把catch中的return註釋掉,返回結果是1,而註釋掉catch中的return語句返回結果是3。小程序
爲何呢?咱們來調試一下程序,在拋出異常的地方也就是1/0那一行打上斷點,而後debug。eclipse
我用的是eclipse,因此直接快捷鍵F6(跳過函數,把函數當作一個總體執行,不進入函數),直接跳到了catch,因此的確是1/0這裏出了問題。函數
繼續F6,直到catch中的return語句。spa
繼續單步執行,發現直接跳過了return語句,繼續執行finally語句塊,繼續F6單步執行,發現執行完finally塊就直接執行catch塊中的return了。debug
如今咱們把catch塊中的return語句註釋掉來從新調試看一看程序是怎樣執行的。調試
程序仍是在1/0的地方拋出異常,而後執行catch塊中的語句,再執行finally塊中的語句。不過當catch塊中沒有return語句是,就會執行finally塊後面的語句直到遇到return語句。code
因此當catch中有return時,test()返回值是1,在catch塊中沒有return語句時,test()的返回值是3。ip
那麼問題來了,爲何當catch中有return時test()的返回值是1,而不是2,finally中明明已經給i賦值爲2了,爲何沒有返回2。
在回答這個問題以前,咱們先來了解一下java中兩種退出方法的方式,
1. 遇到一個返回的指令(return語句)
2. 遇到一個異常,而且沒有搜索到異常處理器,不會給調用返回任何值。
因此當catch中有return時,程序遇到return時就被標記了,finally塊中只是執行最後的清理工做,如數據庫鏈接的釋放等。可是並不會修改return這個語句。
注意:不要在finally塊中加入return語句,若是你在finally加入return就會改變你的return語句。若是你使用eclipse這樣的IDE,當在finally中有return就會提醒你的代碼不正常。
ps:eclipse中經常使用的調試快捷鍵的做用
F5(Step Into):就是單步進入,進入是指當代碼遇到一個調用方法時進入調用方法的方法體中
F6(Step Over):單步跳過,就是當這一步是一個方法時就把它當作一個總體執行,不進入方法中
F7(Step Return):跳出,就是直接跳出當前正在執行的方法體,返回到調用
F8(Resume):從新開始,當執行到斷點的時候,程序被掛起,F8的做用就是讓程序繼續執行,直到下一個斷點從新被掛起