1. 程式人生 > >try catch 中帶返回值執行順序

try catch 中帶返回值執行順序

例1:
    public class TrycatchTest {     public static void main(String[] args) {         System.out.println("x:" + new TrycatchTest().test());     }     int test() {         int x = 1;         try {             System.out.println("try start");             x++;             return x;         } finally {             System.out.println("finally start");             x++;             System.out.println("finally end");         }     } } 輸出的x是2還是3?
結果: try start finally start finally end x:2 也就是說,try語句執行到return前將要返回的x值2 儲存了,然後進入到finally,之後再回到try中返回之前儲存的值,也就是說不管finally中你x怎麼變化,返回的值都是返回之前儲存的,與後來發生的改變無關。 好的,再看下面這個例子: 例2: public class TrycatchTest {     public static void main(String[] args) {         System.out.println("x:" + new TrycatchTest().test());     }     int test() {         int x = 1;         try {             System.out.println("try start");             x++;             return x;         } finally {             System.out.println("finally start");             x++;             return x;         }     } } 程式碼跟上面基本一樣,只不過在finally中加了一條 return x ;  猜猜這時候返回值為多少? 輸出結果:
try start finally start x:3 解析: try中x自加後為2,這時候看到了return語句儲存了當前的值2,然後進入了finally程式碼塊,x自加為3。關鍵來了,這時候多了條return語句。首先第一個問題:這條語句執行嗎?第二:還會回到try嗎? 根據java的設計原則,finally中的語句必須是要執行的,所以finally中的return自然也會作為一條正常語句執行掉,那麼還會回到try嗎? 程式碼塊都已經return結束掉了,還會再回去return一條嗎?對吧,明顯是不能的。 那麼x值為多少,在當下的finally中x值為3然後直接給return回去了,所以是3。
再看看下面的例子: 例3: public class TrycatchTest {     public static void main(String[] args) {         System.out.println("x:" + new TrycatchTest().test2());     }     int test2() {         int x = 1;         try {             x++;             if (x == 2) {                 System.out.println("try x:" + x);                 throw new Exception();             }             return x;         } catch (Exception e) {             x++;             System.out.println("catch:"+x);             return x;         } finally {             x++;         }     } } 程式碼也很簡單,加了個catch程式碼塊,在try中將異常丟擲就會進入到catch程式碼塊中,注意這時候在catch中加入了條return語句,那麼結果是多少?  try x:2 catch:3 x:3 看到沒,也是之前的規則:首先try中x自加為2,然後丟擲了異常進入到catch,自加為3,這時候當想要return的時候將3的值暫存下來,進入到finally,finally中的x值自加為4, 然後回到try,return掉之前儲存的值3. 好了,估計你也多少明白了,每次我們要return前,都會將return的值都暫時儲存下來,然後為了符合java設計規範我們不得不臨時跳到其他程式碼塊處理些事情,處理完再把我們暫存的值給返回;如果我們跳到其他程式碼塊的時候遇到了return語句,就直接執行了那個程式碼塊中的返回語句了,之前儲存的值無效。 最後再看一個例子: 例4: public class TrycatchTest {     public static void main(String[] args) {         System.out.println("x:" + new TrycatchTest().test2());     }     int test2() {         int x = 1;         try {             x++;             if (x == 2) {                 System.out.println("try x:" + x);                 throw new Exception();             }             return x;         } catch (Exception e) {             x++;             System.out.println("catch:"+x);             return x;         } finally {             x++;             System.out.println("finally x:"+x);             return x;         }     } } 在finally中加了條return語句,聰明的你此刻一定能猜出最終返回值是多少了,沒錯,就是4。 看下面的結果: try x:2 catch:3 finally x:4 x:4 如果你能猜出來,代表你已經掌握了,如果還不清楚,再看看我上邊寫的,應該沒多大問題。帶有return 的try catch在面試題中經常會出現,掌握一下還是有必要了。這裡我並沒有從Java原始碼和設計的角度談try catch,之前看了《Java程式設計思想》以及一些其他的講try catch的文章,感覺講的並不是很清晰,就自己寫程式碼測試了下,通過實踐以及自己之前的所看的分析了下,希望能對你有幫助。 

相關推薦

try catch 返回執行順序

例1:    public class TrycatchTest {     public static void main(String[] args) {         System.out.println("x:" + new TrycatchTest().test());     }     in

try catch開啟新的執行緒,不能捕獲執行緒裡面的異常

近期在review程式碼的時候發現,有些人為了圖方便,直接在程式碼引用的最外層放上一個try catch,以為可以捕獲一切異常,降低崩潰率。 事實上,如果try的是新開啟的一個執行緒,那麼這個執行緒裡面出現的異常是catch不到。也就是說在A執行緒中new B執行緒,B執行緒中出現的cr

關於try-catch-finally-return語句的執行順序

直接貼程式碼 main函式 public static void main(String[] args) { System.out.println("=============

Java 返回方法的使用

public java public class mains { public static void main(String[] args) { mains hello = new mains(); int[] scores={79,52,98,81}; hello.sort(sc

【轉載】Java 參無返回返回、方法的重載

語法 ble 數組 實現 執行 愛慕 包含 參數 com 一、 有時方法的執行需要依賴於某些條件,換句話說,要想通過方法完成特定的功能,需要為其提供額外的信息才行。例如,現實生活中電飯鍋可以實現“煮飯”的功能,但前提是我們必須提供食材,如果我們什麽都不提供,那就真是的“巧婦

【轉載】Java 參無返回返回、方法的過載

一、 有時方法的執行需要依賴於某些條件,換句話說,要想通過方法完成特定的功能,需要為其提供額外的資訊才行。例如,現實生活中電飯鍋可以實現“煮飯”的功能,但前提是我們必須提供食材,如果我們什麼都不提供,那就真是的“巧婦難為無米之炊”了。我們可以通過在方法中加入引數列表接收外部傳入的資料資訊,引數可以是任意的基

返回的多執行

參考地址:http://blog.51cto.com/lavasoft/222082 為了提高執行效率,有時可以採用多執行緒執行 1、每個執行緒執行的方法一樣 import java.util.concurrent.*; /** * Java執行緒:有返回值的執行緒 * * @autho

try/catchfinally的執行時間

前言 1.finally沒有return 時,可以看出finally確實在return之前執行了 2. finally有return 時,會覆蓋其他語句中的

python多執行返回案例

問題場景 業務需要對網頁進行PDF轉換,用到了python的pdfkit模組。因報告是成批下來,每批幾百例需要轉換,為了加快報告生成效率,python裡採用了多執行緒寫法。筆者語言是java,所以利用了**Runtime.getRuntime().exec(cm

java多執行緒 demo ,包含返回的Callable和不返回的Runnable

輸入int,利用callable取得double值,再用runnable列印 import java.util.concurrent.*; public class TestMultiThread { private static ExecutorService pool = nul

javap -c 基本用法,簡單位元組檔案解釋,分析try return、finally執行順序問題

1、初始javap,通過javap命令檢視程式計數器、區域性變量表,運算元棧變化。 public class TestZhaZhaJavap { public int test() { int a=100; int b=200; int c=

Java 執行資料庫儲存過程,並返回

前提是載入資源DataSource private JdbcTemplate jdbcTemplate; Java 呼叫儲存過程: @Override public String oneUniscInfoHisToDm(final Str

執行產生返回--Callable介面

Runnable是執行工作的獨立執行緒,但是它不返回任何值。如果你希望執行緒在完成時能夠返回一個值,那麼可以實現Callable介面而不是Runnable介面。在Java SE5中引入的Callable

Java多執行返回的Callable介面

Java多執行緒帶返回值的Callable介面 在面試的時候,有時候是不是會遇到面試會問你,Java中實現多執行緒的方式有幾種?你知道嗎?你知道Java中有可以返回值的執行緒嗎?在具體的用法你知道嗎?如果兩個執行緒同時來呼叫同一個計算物件,計算物件的call方法會被呼叫幾次你知道嗎?如果這些你知道,那麼凱哥(

定義一個返回的方法,實現輸出隨機數數組

publicpublic class mains { public static void main(String[] args) { // 創建對象,對象名為hello mains hello = new mains(); // 調用方法並將返回值保存在變量中

測試 多線程 實現 callable 返回

logs gettime pri per types object pac color i++ 1 package threadTest; 2 3 import java.util.ArrayList; 4 import java.util.Date; 5 i

從ajax的回調函數(success等)返回

ray div eno log left 應該 var code msg 1 var strs = new Array(); 2 3 function getData() { 4 var strs2 = n

pythoninput返回的類型問題

報錯 功能 == text 2.7 () 你在 參考 類型 3.0以後的版本跟2.7的版本在語法上有一些差別的。3.0中的input(),其實對應的是2.7中的raw_input(),功能是讀取用戶輸入的字符串,也就是說你在3.0中用imput獲取的x、y其實是"21"、"

SQL Server 創建返回的存儲過程

AR char cmd esql argument lex class 過程 null --drop procedure zcstest; create procedure zcstest ( @tableName varchar(max), @dataC

hive的的sql的執行順序

src 一個 輸出結果 bsp pre png 數據 sele 圖片 今天在測試在寫hive sql的時候註意到在進行查詢的時候我們把order by放在後面,前面如果沒有這個字段,則執行報錯。 他就會報下面的錯誤。其實這個時候我們就想著是不是哪裏寫錯了。但是仔細一看。好像