摘要:中,然后去執(zhí)行,發(fā)現(xiàn)中也有,然后就執(zhí)行的是中的,返回值為。我們看看中對變量的改變對返回值有沒有影響。中中中這里雖然執(zhí)行了,但是改變的是的值,并沒有改變返回值。
問題描述 筆試
這是京東校招的筆試題:
運行打印運行結果,就是3。
分析我們將return與finally拆為幾種情況綜合分析。
finally之后returnprivate static int func() { int a = 1; try { System.out.println("try"); return a; } catch (Exception e) { System.out.println("catch"); } finally { System.out.println("finally"); } System.out.println("afterFinally"); return 10; }
看執(zhí)行結果,我們分析return的原理。
try中執(zhí)行到return時,先把這個值存起來,再開辟一塊內存存這個值,然后去執(zhí)行finally,finally執(zhí)行之后,回去執(zhí)行之前沒執(zhí)行完的return語句,將值返回。所以這種情況下,finally后的代碼塊是不執(zhí)行的。
finally中returnprivate static int func() { int a; try { System.out.println("try"); a = 1; return a; } catch (Exception e) { System.out.println("catch"); a = 2; return a; } finally { System.out.println("finally"); a = 3; return a; } }
這就和筆試題中一樣了。
try中return,然后去執(zhí)行finally,發(fā)現(xiàn)finally中也有return,然后就執(zhí)行的是finally中的return,返回值為3。
finally中改變變量的值 基本數(shù)據(jù)類型將上一個例子中finally中的return a;刪了,就是我們接下來的測試。我們看看finally中對變量的改變對返回值有沒有影響。
private static int func() { int a; try { System.out.println("try"); a = 1; return a; } catch (Exception e) { System.out.println("catch"); a = 2; return a; } finally { System.out.println("finally"); a = 3; } }
try中a = 1;
try中return a;
finally中a = 3;
這里雖然執(zhí)行了a = 3,但是改變的是a的值,并沒有改變返回值。
要是不信我們在finally再添加一行輸出以驗證我們的猜想。
引用數(shù)據(jù)類型相信這里我分為兩個類別來敘述,熟悉Java的你應該明白我接下來要說什么了。
建個類MyObject,這里是為了演示方便才將value設置為public的,不要效仿啊。
public static void main(String[] args) { MyObject object = func(); System.out.println(object.value); } private static MyObject func() { MyObject myObject = new MyObject(); try { System.out.println("try"); myObject.value = 1; return myObject; } catch (Exception e) { System.out.println("catch"); myObject.value = 2; return myObject; } finally { System.out.println("finally"); myObject.value = 3; } }
與之前類似,不過這里是在finally中修改對象的屬性。
運行,返回的結果是我們在finally中改變過的值。
finally中改變的,是myObject這個對象的value值,這個對象在堆內存中,而棧內存中用于返回的對象,其實也是堆內存中對象的引用,所以finally的改變會改變引用數(shù)據(jù)類型的返回值。
總結格物致知,這是對基礎的最佳實踐。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://hztianpu.com/yun/76855.html
摘要:基礎系列的與方法類初始化順序線程池如何彈性伸縮的幾個要點的緩存什么場景下使用阻塞隊列的使用及模式中的序本文主要簡述中有的情況。參考關于中的執(zhí)行順序 Java基礎系列 Java的hashcode與equals方法 Java類初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的幾個要點 Integer的緩存 什么場景下使用阻塞隊列 volatile的使用及...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實說,我終于用做了一點練習。當我去實際使用它時,我有點不確定它的細節(jié)。事實上,這就是本文的靈感來源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實說,我終于用finally做了一點練習。當我去實際使用它時,我有點不確定它的細節(jié)。所以我把幾個例子放在一起。 當你...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實說,我終于用做了一點練習。當我去實際使用它時,我有點不確定它的細節(jié)。事實上,這就是本文的靈感來源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實說,我終于用finally做了一點練習。當我去實際使用它時,我有點不確定它的細節(jié)。所以我把幾個例子放在一起。 當你...
摘要:隨著的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多。但老實說,我終于用做了一點練習。當我去實際使用它時,我有點不確定它的細節(jié)。事實上,這就是本文的靈感來源。 隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實說,我終于用finally做了一點練習。當我去實際使用它時,我有點不確定它的細節(jié)。所以我把幾個例子放在一起。 當你...
閱讀 3644·2021-11-19 09:40
閱讀 1650·2021-10-13 09:41
閱讀 2866·2021-09-29 09:35
閱讀 2850·2021-09-23 11:21
閱讀 1967·2021-09-09 11:56
閱讀 1016·2019-08-30 15:53
閱讀 966·2019-08-30 15:52
閱讀 723·2019-08-30 12:47