南阳阿里巴巴网站推广,从网站下载壁纸做海报涉及,做网站业务员,wordpress投稿 图片从字节码的角度异常处理 生成字节码Javap 命令的使用基本语法 字节码文件testTryCatchtestTryCatchFinallytestTryWithResource 如果大家对与java的异常使用还有问题或者还不太了解#xff0c;建议先看一下我之前写的Java异常了解一下基本 的异常处理知识#xff0c;再看这篇… 从字节码的角度异常处理 生成字节码Javap 命令的使用基本语法 字节码文件testTryCatchtestTryCatchFinallytestTryWithResource 如果大家对与java的异常使用还有问题或者还不太了解建议先看一下我之前写的Java异常了解一下基本 的异常处理知识再看这篇文章。
生成字节码
public class Test27 {public String testTryCatch() {try {int a 1;int b 0;return String.valueOf(a / b);} catch (ArithmeticException e) {return divide 0 ;}}public String testTryCatchFinally() {try {int a 1;int b 0;return String.valueOf(a / b);} catch (ArithmeticException e) {return divide 0 ;}finally {System.out.println(finally);}}public String testTryWithResource() {try {int a 1;int b 0;return String.valueOf(a / b);} catch (ArithmeticException e) {return divide 0 ;}finally {System.out.println(finally);}}}执行javac命令编译成字节码文件
D:\project\mydemo\src\main\java\com\example\mydemo\testjavac Test27.javaJavap 命令的使用
javap 是 Java 提供的反汇编工具用于将 Java 字节码文件.class 文件反汇编成人类可读的 Java 汇编代码或者说是 Java 字节码的指令。这对于理解 Java 编译器生成的字节码、学习 JVM 的工作原理、调试和优化代码都非常有用。
基本语法
javap [options] classesD:\project\mydemo\src\main\java\com\example\mydemo\testjavap -c Test27.class常用选项
-c显示字节码指令反汇编。-verbose显示详细信息包括类、字段、方法的签名和属性。-l显示行号和本地变量表信息。-p显示所有私有成员、受保护成员和默认包访问级别的成员。-constants显示静态常量池。-classpath 或 -cp 指定类路径。 -s显示内部类型签名。-public仅显示公共成员和类。-protected显示公共和受保护成员和类默认行为。-package显示公共和包访问级别的成员和类不加 -p 时默认行为。-private显示所有成员和类包括私有成员。
字节码文件
生成的完整的字节码文件我传上来了有需要的可以下载这里我们逐个分析每个方法的字节码。
testTryCatch public java.lang.String testTryCatch();Code:0: iconst_11: istore_12: iconst_03: istore_24: iload_15: iload_26: idiv7: invokestatic #7 // Method java/lang/String.valueOf:(I)Ljava/lang/String;10: areturn11: astore_112: ldc #15 // String divide 014: areturnException table:from to target type0 10 11 Class java/lang/ArithmeticException0到3行是把1跟0这两个常量存到slot里面4到6是把两个操作数入栈然后做除法。然后下面是异常表如果from0 to 10 发生异常跳转到target11行处理。
testTryCatchFinally public java.lang.String testTryCatchFinally();Code:0: iconst_11: istore_12: iconst_03: istore_24: iload_15: iload_26: idiv7: invokestatic #7 // Method java/lang/String.valueOf:(I)Ljava/lang/String;10: astore_311: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;14: ldc #23 // String finally16: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V19: aload_320: areturn21: astore_122: ldc #15 // String divide 024: astore_225: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;28: ldc #23 // String finally30: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V33: aload_234: areturn35: astore 437: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;40: ldc #23 // String finally42: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V45: aload 447: athrowException table:from to target type0 11 21 Class java/lang/ArithmeticException0 11 35 any21 25 35 any35 37 35 any
这段字节码我们主要观察Exception table很明显
0 - 11 行如果发生Class java/lang/ArithmeticException则跳转到21行开始执行。0 - 11行没有发生异常则跳转到35行开始执行实际上你仔细看的话会发现35行之后是finally的那部分。21 - 25行执行的是catch块里面的语句执行完之后也会自动跳转到35行执行35 - 37行执行的是把异常class保存起来以便执行throw的时候能正常抛出去。
testTryWithResource public java.lang.String testTryWithResource();Code:0: new #31 // class java/io/FileInputStream3: dup4: ldc #33 // String teset6: invokespecial #35 // Method java/io/FileInputStream.init:(Ljava/lang/String;)V9: astore_110: ldc #37 // String ok12: astore_213: aload_114: invokevirtual #39 // Method java/io/FileInputStream.close:()V17: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;20: ldc #23 // String finally22: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V25: aload_226: areturn27: astore_228: aload_129: invokevirtual #39 // Method java/io/FileInputStream.close:()V32: goto 4135: astore_336: aload_237: aload_338: invokevirtual #44 // Method java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V41: aload_242: athrow43: astore_144: aload_145: invokevirtual #50 // Method java/io/IOException.printStackTrace:()V48: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;51: ldc #23 // String finally53: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V56: goto 7259: astore 461: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;64: ldc #23 // String finally66: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V69: aload 471: athrow72: ldc #37 // String ok74: areturnException table:from to target type10 13 27 Class java/lang/Throwable28 32 35 Class java/lang/Throwable0 17 43 Class java/io/IOException27 43 43 Class java/io/IOException0 17 59 any27 48 59 any59 61 59 any最后这段字节码我就不带大家一起读了实际上你自己看就会发现实际上TryWithResource是语法糖把之前我们写的一些cath的内容编译器帮我们添加进去了。编译器自动关闭资源的同时也帮助我们把异常处理加了进去。如果有疑问的欢迎评论私信我。我有时间都会给大家回复解答的。