栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JVM如何保证finally块的执行?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM如何保证finally块的执行?

编译这个小程序(我意识到我应该使用您的示例,但是没关系)

public static void main(String[] args) {    try {        Float s = Float.parseFloat("0.0327f");    } finally {        System.out.println("hello");    }}

我用了

>java -version java version "1.8.0-ea"  // should be same for 7Java(TM) SE Runtime Environment (build 1.8.0-ea-b118)Java HotSpot(TM) 64-Bit Server VM (build 25.0-b60, mixed mode)

然后执行

javac -v -c <fully qualified class name>

获取字节码。您会看到类似

public static void main(java.lang.String[]);  flags: ACC_PUBLIC, ACC_STATIC  Code:    stack=2, locals=3, args_size=1       0: ldc#2       // String 0.0327f       2: invokestatic  #3       // Method java/lang/Float.parseFloat:(Ljava/lang/String;)F       5: invokestatic  #4       // Method java/lang/Float.valueOf:(F)Ljava/lang/Float;       8: astore_1       9: getstatic     #5       // Field java/lang/System.out:Ljava/io/PrintStream;      12: ldc#6       // String hello      14: invokevirtual #7       // Method java/io/PrintStream.println:(Ljava/lang/String;)V      17: goto          31      20: astore_2      21: getstatic     #5       // Field java/lang/System.out:Ljava/io/PrintStream;      24: ldc#6       // String hello      26: invokevirtual #7       // Method java/io/PrintStream.println:(Ljava/lang/String;)V      29: aload_2      30: athrow      31: return    Exception table:       from    to  target type0     9    20   any          20    21    20   any    LineNumberTable:      line 10: 0      line 12: 9      line 13: 17      line 12: 20      line 14: 31    StackMapTable: number_of_entries = 2         frame_type = 84         stack = [ class java/lang/Throwable ]         frame_type = 10 

您会注意到中的 代码

finally
出现了两次,一次在之前
goto
,一次在之后。您还会注意到
Exceptiontable
,如果在某行发生异常,则which指定要去的语句。

因此,如果在语句0-9之间发生任何异常,请转到第20行并在

finally
之后执行内的所有内容
goto
。如果没有异常,请执行
finally
,然后
goto
finally
之后执行跳过
goto

在所有情况下,您都将在

finally
块内执行代码。

未明确处理其他异常

使用一个

finally
块,
Exception table
将创建一个条目,该条目将处理 任何 类型的
Throwable


这是字节码指令的清单。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431402.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号