<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java中的finally一定會被執(zhí)行嗎?

          共 7371字,需瀏覽 15分鐘

           ·

          2021-07-04 09:07

          點擊關(guān)注公眾號,Java技術(shù)文及時送達

          一、前言

          因為這次面試有問到一些同學finally的問題,發(fā)現(xiàn)自己這塊好像有點記不太清楚了,有的點可能還給人家說錯了,一度弄得場面有些尷尬。所以說這篇文章深入研究一下finally的執(zhí)行情況和返回值的情況。

          二、finally一定會執(zhí)行嗎?

          先給答案:肯定不是。
          我們可以看兩種情況:
          1.在執(zhí)行try塊之前直接return,我們發(fā)現(xiàn)finally塊是不會執(zhí)行的

          public class TryCatchTest {

            private static int total() {
              int i = 11;
              if (i == 11) {
                return i;
              }
              try {
                System.out.println("執(zhí)行try");
              } finally {
                System.out.println("執(zhí)行finally");
              }
              return 0;
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }

          輸出結(jié)果:
          執(zhí)行main:11
          復(fù)制代碼
          2.在執(zhí)行try塊之前制造一個錯誤,直接爆紅

          public class TryCatchTest {

            private static int total() {
              return 1 / 0;
              try {
                System.out.println("執(zhí)行try");
              } finally {
                System.out.println("執(zhí)行finally");
              }
              return 0;
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }
          綜上我們看出,如果程序連try塊都執(zhí)行不到,那么finally塊自然就不會執(zhí)行到了。
          不過這里有的同學就會問:如果執(zhí)行了try塊,finally塊一定會執(zhí)行嗎?有的同學答案就是一定會,其實非然,看看下面的例子吧:
          public class TryCatchTest {

            private static int total() {
              try {
                System.out.println("執(zhí)行try");
                System.exit(0);
              } catch (Exception e) {
                System.out.println("執(zhí)行catch");
              } finally {
                System.out.println("執(zhí)行finally");
              }
              return 0;
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }
          輸出結(jié)果:
          執(zhí)行try
          我們在執(zhí)行try塊之中退出jvm,就沒事了,都不執(zhí)行了。當然這個情況是比較極端的,記住就行,沒事不要亂整這個。最后總結(jié)一下:不管是給try塊中造了個異常,還是在try塊中進行return,我們發(fā)現(xiàn)finally塊還是會執(zhí)行的。因為異常處理設(shè)計初衷就是讓finally塊始終執(zhí)行。這個總結(jié)在finally的執(zhí)行時機得到證明。

          三、finally執(zhí)行時機探討

          首先看常規(guī)情況:
          public class TryCatchTest {

            private static int total() {
              try {
                System.out.println("執(zhí)行try");
                return 11;
              } finally {
                System.out.println("執(zhí)行finally");
              }
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }
          輸出結(jié)果:
          執(zhí)行try
          執(zhí)行finally
          執(zhí)行main:11
          分析一下,不難得出在這個例子中finally塊執(zhí)行在try塊的return之前。我們給try塊中造一個異常:
          public class TryCatchTest {

            private static int total() {
              try {
                System.out.println("執(zhí)行try");
                return 1 / 0;
              } catch (Exception e) {
                System.out.println("執(zhí)行catch");
                return 11;
              } finally {
                System.out.println("執(zhí)行finally");
              }
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }

          }
          輸出結(jié)果:
          執(zhí)行try
          執(zhí)行catch
          執(zhí)行finally
          執(zhí)行main:11
          同樣的,finally執(zhí)行在catch塊return的執(zhí)行前。

          四、finally塊中的返回值


          1.finally塊不含返回值,但是做改變變量值的操作
          看一個例子:
          public class TryCatchTest {

            private static int total() {
              int i = 0;
              try {
                System.out.println("執(zhí)行try:" + i);
                return i;
              } finally {
                ++i;
                System.out.println("執(zhí)行finally:" + i);
              }
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }
          輸出結(jié)果:
          執(zhí)行try:0
          執(zhí)行finally:1
          執(zhí)行main:0
          如果看完前面分析,會發(fā)現(xiàn)跟想象的不太一樣。我們經(jīng)過前面的分析,finally塊的執(zhí)行時機應(yīng)該是return之前,那理論上我們應(yīng)該先++i使得i等于1,在執(zhí)行return i; 自然會返回1。
          可是結(jié)果卻返回了0,這是因為Java程序會把try或者catch塊中的返回值保留,也就是暫時的確認了返回值,然后再去執(zhí)行finally代碼塊中的語句。等到finally代碼塊執(zhí)行完畢后,如果finally塊中沒有返回值的話,就把之前保留的返回值返回出去。
          2.finally中含有返回值
          示例1:
          public class TryCatchTest {

            private static int total() {
              try {
                System.out.println("執(zhí)行try");
                return 1;
              } finally {
                System.out.println("執(zhí)行finally");
                return 2;
              }
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }
          輸出結(jié)果:
          執(zhí)行try
          執(zhí)行finally
          執(zhí)行main:2

          示例2:
          public class TryCatchTest {

            private static int total() {
              int i = 1;
              try {
                System.out.println("執(zhí)行try:" + i);
                return i;
              } finally {
                ++i;
                System.out.println("執(zhí)行finally:" + i);
                return i;
              }
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }
          輸出結(jié)果:
          執(zhí)行try:1
          執(zhí)行finally:2
          執(zhí)行main:2

          示例3:
          public class TryCatchTest {

            private static int total() {
              int i = 1;
              try {
                System.out.println("執(zhí)行try:" + i);
              } finally {
                ++i;
                System.out.println("執(zhí)行finally:" + i);
              }
              return i;
            }

            public static void main(String[] args{
              System.out.println("執(zhí)行main:" + total());
            }
          }
          執(zhí)行結(jié)果:
          執(zhí)行try:1
          執(zhí)行finally:2
          執(zhí)行main:2
          這三個示例都說明了一點,在分析含有finally塊的方法返回值時,要對于return出現(xiàn)的地方進行具體分析。在finally塊中進行return操作的話,則方法整體的返回值就是finally塊中的return返回值。如果在finally塊之后的方法內(nèi)return,則return的值就是進行完上面的操作后的return值。

          如有文章對你有幫助,

          歡迎關(guān)注??、點贊??、轉(zhuǎn)發(fā)??!

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲黄色在线播放 | 8x8x皇冠视频免费观看 | 人人操人人看人人 | 中国老熟女重囗味HDXX | 操逼小电影 |