Java異常時的返回值

先來看一個小程序: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那一行打上斷點,而後debugeclipse

我用的是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()的返回值是3ip

那麼問題來了,爲何當catch中有returntest()的返回值是1,而不是2finally中明明已經給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的做用就是讓程序繼續執行,直到下一個斷點從新被掛起

相關文章
相關標籤/搜索