最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java.try catch finally 的執(zhí)行順序說明

 更新時(shí)間:2020年10月20日 09:53:40   作者:qq_45239139  
這篇文章主要介紹了Java.try catch finally 的執(zhí)行順序說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

示例1:

public static String hello() {
    String s = "商務(wù)";
    try {
      return s;
    } catch (Exception e) {
      return "catch進(jìn)來了";
    } finally {
      s = "你好世界";
      return s;
    }
  }

返回結(jié)果:你好世界,此時(shí)的返回順序是 finally > try

示例2:

public static String hello() {
    String s = "商務(wù)";
    try {
      return s;
    } catch (Exception e) {
      return "catch進(jìn)來了";
    } finally {
      s = "你好世界";
    }
  }

返回結(jié)果:商務(wù)

因?yàn)樵?try 處會(huì)進(jìn)行 s 值的緩存

示例3:

public static void hehe() {
    int a = 10;
    try {
      a += 1;
      System.out.println(a);
      throw new Exception("catch測(cè)試");
    } catch (Exception e) {
      e.printStackTrace();
      a += 10;
      System.out.println(a);
    } finally {
      a += 10000;
      System.out.println(a);
    }
    System.out.println(a);
  }

返回結(jié)果:

11
21
10021
10021

故意在 try 處拋出一個(gè)異常進(jìn)入 catch,此時(shí)返回的順序是 try > catch > finally > 最后一行代碼

補(bǔ)充知識(shí):Java異常獲取中try-catch-finally塊執(zhí)行順序

最近看面試題,發(fā)現(xiàn)這個(gè)比較好玩,try-catch-finally塊的執(zhí)行順序問題。

一般認(rèn)為,finally最后執(zhí)行,做收尾工作,無論try塊是否捕獲異常,最后finally都會(huì)工作。但是這樣還是比較籠統(tǒng),如果沒有catch,而是將異常拋出,讓其他方法處理,那么是先進(jìn)入其他方法還是先執(zhí)行finally?如果try塊中return了,那么finally還執(zhí)行不執(zhí)行?進(jìn)一步,如果try、finally全部有return,那么執(zhí)行是怎樣的過程?

確實(shí),異常這些還是最早學(xué)Java的時(shí)候?qū)W的,當(dāng)時(shí)似乎也沒考慮這么多。借此機(jī)會(huì)研究一下異常獲取的順序。

節(jié)省時(shí)間,直接結(jié)論:

try->catch->finally按順序執(zhí)行,不管是否有異常,不管try中有什么操作,就算是return,也得往后稍稍,最后這個(gè)方法一定是要執(zhí)行finally。

如果try中拋出異常,而異常是留給上層方法處理,那么在拋出后,仍然運(yùn)行finally,然后再回溯到上層。

自然,如果try中有return——也算是回溯了,返回值會(huì)存在棧中等待,等finally運(yùn)行之后再回溯。

而如果finally中有return,那么直接從finally中結(jié)束方法。

如果在方法中直接結(jié)束程序,即調(diào)用System.exit()方法,那么就直接結(jié)束了,此時(shí)finally是不執(zhí)行的。由此可以認(rèn)為,特殊情況導(dǎo)致程序的退出是可能導(dǎo)致一些問題的。畢竟finally一般寫的是關(guān)閉對(duì)象、資源的代碼。

通過代碼分析:

先寫了一個(gè)包含情況比較多的例子:

package me.iwts; 
public class Main{
  public static int rank;
 
  public static void solve1() throws Exception{
    try {
      System.out.println("solve 1 try,rank: "+rank++);
      throw new Exception("throw by solve 1");
    }finally {
      System.out.println("solve 1 finally,rank: "+rank++);
    }
  }
 
  public static void solve2(){
    try{
      System.out.println("solve 2 try,rank: "+rank++);
      solve1();
    }catch (Exception ex){
      System.out.println("catch exception : "+ex.getMessage()+",rank: "+rank++);
    }finally {
      System.out.println("solve 1 finally,rank: "+rank++);
    }
  }
 
  public static void main(String args[]) {
    rank = 1;
    solve2();
    System.out.println("over");
  }
}

rank是計(jì)數(shù)??梢钥吹?,整體上是先調(diào)用solve2方法,在其中調(diào)用solve1,solve1拋出了一個(gè)異常,讓solve2捕獲處理。大家可以先自己猜一下。

下面是返回答案:

solve 2 try,rank: 1
solve 1 try,rank: 2
solve 1 finally,rank: 3
catch exception : throw by solve 1,rank: 4
solve 1 finally,rank: 5
over

根據(jù)上面的結(jié)果可以分析:try-catch-finally執(zhí)行順序:首先是try執(zhí)行,如果發(fā)生異常,那么直接捕獲異常,最后執(zhí)行finally。但是,如果拋出異常,例如在solve1方法中,throw了一個(gè)異常,那么不會(huì)立刻回溯到上一個(gè)方法,而是仍然執(zhí)行finally。

通過solve1的執(zhí)行,我們可以認(rèn)為,finally之前的所有代碼,正常執(zhí)行,但是返回之類的,全部被“卡”了下來,只有在finally執(zhí)行之后,才能繼續(xù)執(zhí)行。

這里就又有疑惑了,一般認(rèn)為throw了一個(gè)異常,就算是回溯了,為什么finally仍然執(zhí)行了?如果這個(gè)不夠明顯,那么再看這個(gè)代碼:

package me.iwts; 
public class Main{
  public static int solve(){
    try{
      System.out.println("try");
      return 1;
    }finally {
      System.out.println("finally");
      return 2;
    }
  }
 
  public static void main(String args[]) {
    System.out.println(solve());
  }
}

返回值是多少?

try
finally
2

try塊都已經(jīng)return了,最后為什么是返回的return2?并且try塊確實(shí)是運(yùn)行了。再改一下代碼:

package me.iwts; 
public class Main{
  public static int solve(){
    int i = 1;
    try{
      System.out.println("try");
      return i++;
    }finally {
      System.out.println("finally");
      return i;
    }
  }
 
  public static void main(String args[]) {
    System.out.println(solve());
  }
}

注意,try塊返回了i++,那么我們debug就能看出來return這句到底是執(zhí)行還是沒執(zhí)行,那么有這樣的圖:

可以看到,return確實(shí)是執(zhí)行的。

所以,認(rèn)為finally是無論怎樣一定在方法的最后結(jié)束前執(zhí)行的。搜了一些資料,是說finally會(huì)在方法結(jié)束之前執(zhí)行,而之前所有的執(zhí)行,包括return,全部都停留在棧中,而finally最終執(zhí)行后才繼續(xù)。所以這樣也能解釋,第一次代碼本應(yīng)該回溯的代碼執(zhí)行完finally后才回溯,return的時(shí)候也是等finally執(zhí)行之后再執(zhí)行。

或許“return的時(shí)候也是等finally執(zhí)行之后再執(zhí)行”這句話又引出了一個(gè)問題:finally究竟是直接運(yùn)行完結(jié)束,還是運(yùn)行完之后再回到原來return的地方?

這里我們可以把i++換成++i,結(jié)果就不截圖了——finally就是最終執(zhí)行,如果有return,直接從finally返回。

還有一種情況,直接結(jié)束程序會(huì)怎么樣?

package me.iwts; 
public class Main{
  public static void solve(){
    try{
      System.out.println("try");
      System.exit(0);
    }finally {
      System.out.println("finally");
    }
  }
 
  public static void main(String args[]) {
    solve();
  }
}

結(jié)果:

try

強(qiáng)制結(jié)束大過天。由此,也可以認(rèn)為特殊情況導(dǎo)致程序直接結(jié)束,不會(huì)執(zhí)行finally。因?yàn)閒inally一般寫的都是關(guān)閉對(duì)象、資源的代碼,所以這些特殊情況導(dǎo)致的程序強(qiáng)制結(jié)束,可能會(huì)引發(fā)一些問題的。

以上這篇Java.try catch finally 的執(zhí)行順序說明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java LRU(Least Recently Used )詳解及實(shí)例代碼

    java LRU(Least Recently Used )詳解及實(shí)例代碼

    這篇文章主要介紹了java LRU(Least Recently Used )詳解及實(shí)例代碼的相關(guān)資料,Java里面實(shí)現(xiàn)LRU緩存通常有兩種選擇,一種是使用LinkedHashMap,一種是自己設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),使用鏈表+HashMap,需要的朋友可以參考下
    2016-11-11
  • 詳解Java中NullPointerException的處理方法

    詳解Java中NullPointerException的處理方法

    這篇文章將帶大家來單獨(dú)看一個(gè)很常見的異常--空指針異常,這個(gè)可以說是每個(gè)Java程序員都必知的異常,所以我們不得不單獨(dú)學(xué)習(xí)一下,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • java FileWriter 追加文件及文件改名方式

    java FileWriter 追加文件及文件改名方式

    這篇文章主要介紹了java FileWriter 追加文件及文件改名的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java/Spring項(xiàng)目的包開頭為什么是com詳解

    Java/Spring項(xiàng)目的包開頭為什么是com詳解

    這篇文章主要介紹了Java/Spring項(xiàng)目的包開頭為什么是com的相關(guān)資料,在Java中包命名遵循域名反轉(zhuǎn)規(guī)則,即使用公司的域名反轉(zhuǎn)作為包的前綴,以確保其全球唯一性和避免命名沖突,這種規(guī)則有助于邏輯分層、代碼可讀性提升和標(biāo)識(shí)代碼來源,需要的朋友可以參考下
    2024-10-10
  • SWT(JFace)Group(分組顯示)

    SWT(JFace)Group(分組顯示)

    SWT(JFace)體驗(yàn)之Group(分組顯示)
    2009-06-06
  • mybatis對(duì)象List<String> List<Integer>屬性映射方式

    mybatis對(duì)象List<String> List<Integer>屬性映射方式

    這篇文章主要介紹了mybatis對(duì)象List<String> List<Integer>屬性映射方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • JAVA面向?qū)ο笾^承?super入門解析

    JAVA面向?qū)ο笾^承?super入門解析

    在JAVA類中使用super來引用父類的成分,用this來引用當(dāng)前對(duì)象,如果一個(gè)類從另外一個(gè)類繼承,我們new這個(gè)子類的實(shí)例對(duì)象的時(shí)候,這個(gè)子類對(duì)象里面會(huì)有一個(gè)父類對(duì)象。怎么引用里面的父類對(duì)象呢?用super來引用,this指當(dāng)前對(duì)象的引用,super是當(dāng)前對(duì)象里面的父對(duì)象的引用
    2022-01-01
  • 10分鐘在服務(wù)器部署好Jenkins的詳細(xì)過程

    10分鐘在服務(wù)器部署好Jenkins的詳細(xì)過程

    這篇文章主要介紹了10分鐘在服務(wù)器部署好Jenkins,本文主要是?Jenkins?的安裝部署,那前提我們應(yīng)該裝好?Git?Maven?JDK,準(zhǔn)備工作本文不給大家詳細(xì)介紹了,對(duì)服務(wù)器部署Jenkins相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-08-08
  • Java?Runnable和Thread實(shí)現(xiàn)多線程哪個(gè)更好你知道嗎

    Java?Runnable和Thread實(shí)現(xiàn)多線程哪個(gè)更好你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java?Runnable和Thread實(shí)現(xiàn)多線程哪個(gè)更好,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2022-03-03
  • 在啟動(dòng)后臺(tái) jar包時(shí),使用指定的 application.yml操作

    在啟動(dòng)后臺(tái) jar包時(shí),使用指定的 application.yml操作

    這篇文章主要介紹了在啟動(dòng)后臺(tái) jar包時(shí),使用指定的 application.yml操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評(píng)論

道孚县| 台安县| 邵东县| 湖北省| 临城县| 青川县| 望都县| 湄潭县| 浦北县| 嘉荫县| 五河县| 名山县| 元江| 吉安县| 乌兰浩特市| 女性| 新蔡县| 交城县| 望谟县| 宝坻区| 大庆市| 西乌珠穆沁旗| 凤阳县| 道孚县| 四子王旗| 乐都县| 青岛市| 桂林市| 九寨沟县| 宜昌市| 收藏| 台中市| 湖北省| 游戏| 正定县| 客服| 三河市| 马尔康县| 高要市| 绥江县| 湖南省|