编译这个小程序(我意识到我应该使用您的示例,但是没关系)
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。
这是字节码指令的清单。



