国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java finally塊執行時機全面分析

java finally塊執行時機全面分析

2020-06-05 14:51jingxian JAVA教程

下面小編就為大家帶來一篇java finally塊執行時機全面分析。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

javafinally 關鍵字通常與try catch塊一起使用。用來在方法結束前或發生異常時做一些資源釋放的操作。最近也看到網上有一些討論try catch finally關鍵詞執行的順序的文章,并給出了finally塊是在方法最后執行的。

這些觀點普遍認為:

1) finally關鍵詞是在程序return語句后返回上一級方法前執行的,其中返回值會保存在一個臨時區域,待執行完finally塊的部分后,在將臨時區域的值返回。

2) 若finally塊里有返回值會替換掉程序中前面的try 或catch塊中return語句存放在臨時區域的值。

但是問題真的是這樣的嗎,我們仔細的想想,jvm是在運行時對字節碼指令進行解釋執行的,當他在執行到return語句后,他哪知道后面有沒有finally塊,如果沒有finally塊怎么辦,不管是字節碼指令還是計算機的指令應該是明確的,jvm沒有那么智能,同一個指令必須是明確的,不會包含兩層含義。所以對于return語句在運行時不管什么情況,統一會彈出棧的內容并返回到調用方法。

與此同時,我們可以看到《深入java虛擬機》這一本書中給出了另外一種解釋。在java編譯器編譯finally子句時會生成jsr指令,它使jvm調轉到微型子例程進行執行,也就是finally塊處,同時將程序中的return 0語句編譯為在調用jsr指令前棧中的返回變量到局部變量,調用jsr指令,執行finally塊,finally塊返回,在將局部變量中的返回值壓入棧,執行ireturn指令,從棧中彈出返回值,返回到調用方法,這里在執行jsr指令前將返回值保存在局部變量中,是因為finally塊執行的過程中可能發生異常或者說是也有返回值,只有這樣做才能保證最后程序執行的一致性。由于《深入java虛擬機》寫的已經也一些年代了,同時作者使用的jvm編譯器的實現及版本與本文討論的也有差別。所以經過測試,對于同一程序不同的編譯器實現或版本不同的字節碼的生成稍微有些差別。有興趣可以看看這本書中finally子句生成的字節碼。

本文的字節碼生成使用的是Oracle的jdk8u-25版本的編譯器編譯生成的。

下面我們來看一個實例。

1.try catch finally 示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class FinallyTest {
  public static void main(String[] args) {
 
    int r = test();
    System.out.println(r);
 
  }
  public static int test()
  {
    try {
      System.out.println("try");
      //return 1/0;
      return 0;
    } catch (Exception e) {
      System.out.println("exception");
      return 100;
    }finally{
      System.out.println("finally");
 
    }
 
  }
 
}

try塊中使用return 0語句,程序的運行結果是:

try
finally
0

try塊中使用 return 1/0 語句,程序運行的結果是:

exception
finally
100

其實通過運行結果我們可以看出的是finally塊是在try或catch塊中的return語句前其他語句后執行的。也就是說程序的書寫順序與我們執行順序不符,因為jvm是對字節碼進行解釋執行的,那么我們需要看看java編譯器是如何編譯這段代碼的,看看其生成的字節碼究竟是什么樣的。

2.程序生成的部分字節碼:(java字節碼指令請參考)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static int test();
  descriptor: ()I
  flags: ACC_PUBLIC, ACC_STATIC
  Code:
   stack=2, locals=2, args_size=0
     0: getstatic   #20         // Field java/lang/System.out:Ljava/io/PrintStream;
     3: ldc      #36         // String try
     5: invokevirtual #38         // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     8: getstatic   #20         // Field java/lang/System.out:Ljava/io/PrintStream;
    11: ldc      #41        // String finally
    13: invokevirtual #38         // Method java/io/PrintStream.println:(Ljava/lang/String;)V
    16: iconst_0
    17: ireturn
    18: astore_0
    19: getstatic   #20         // Field java/lang/System.out:Ljava/io/PrintStream;
    22: ldc      #43         // String exception
    24: invokevirtual #38         // Method java/io/PrintStream.println:(Ljava/lang/String;)V
    27: getstatic   #20         // Field java/lang/System.out:Ljava/io/PrintStream;
    30: ldc      #41         // String finally
    32: invokevirtual #38         // Method java/io/PrintStream.println:(Ljava/lang/String;)V
    35: bipush    100
    37: ireturn
    38: astore_1
    39: getstatic   #20         // Field java/lang/System.out:Ljava/io/PrintStream;
    42: ldc      #41         // String finally
    44: invokevirtual #38         // Method java/io/PrintStream.println:(Ljava/lang/String;)V
    47: aload_1
    48: athrow
   Exception table:
     from  to target type
       0   8  18  Class java/lang/Exception
       0   8  38  any
      18  27  38  any

從紅色的部分我們可以看出:10,11行對應的是finally塊語句指令,16,17對應的是return 0指令,在try塊其他語句之后,return之前。而19,20對應的是finally塊指令,21,22對應的是return 100語句的指令,在catch其他語句之后,return之前,由此我們可以看出這些背后發生的一切是java編譯器為我們做了這一切,至于程序中發生的異常,jvm會從異常表找到對應處理異常的地址位置執行。

因此我們可以得出結論finally塊中的語句會由java編譯器插入到try塊和catch塊return語句之前,其他語句之后。在這里也沒有生成jsr調用的子例程。所以才發生不管是執行try塊還是執行catch塊,最終在方法返回前都會執行finally塊。

以上這篇java finally塊執行時機全面分析就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品欧美一区二区三区久久久 | 草久在线视频 | 一区二区三区高清不卡 | 亚洲国产欧美日韩 | 国产人成精品一区二区三 | xvideos.蜜桃一区二区 | www.嫩草| 美女视频一区二区三区 | 成年女人免费v片 | 中国成人免费视频 | 久久久精品一区二区 | 黄色av网站在线观看 | 日韩中文字幕在线 | 国产伦乱| 久久久精 | 久久亚洲一区二区三区明星换脸 | av黄色在线播放 | 成人免费在线电影 | 特黄特色大片在线观看视频网站 | 99精品国产一区二区三区 | 韩国一区二区视频 | 四虎永久免费影视 | 国产成人精品一区二区三区视频 | 欧美专区在线 | 亚洲国产成人av好男人在线观看 | 黄免费看| 国内外成人在线视频 | 亚洲男人的天堂网站 | 福利久久久| www免费网站在线观看 | 欧洲亚洲视频 | 色日韩| 在线观看国产二区 | 中文字幕在线一区 | 欧美一级二级视频 | 91精品国产日韩91久久久久久 | 亚洲精品免费在线视频 | 日韩欧美国产一区二区 | 中文在线播放 | 在线观看一区二区三区视频 | 一区二区国产精品 |