当前位置: 首页 > news >正文

如何建设远程教育网站网站建设 浏览器兼容

如何建设远程教育网站,网站建设 浏览器兼容,wordpress小鹅通,搜索引擎推广方式有哪些Java 中有一个非常重要的内容是 try-catch-finally 的执行顺序和返回值问题#xff0c;其中 finally 一定会执行#xff0c;但是为什么会这样#xff1f; 下面看下 try-catch-finally 背后的实现原理 try-catch public class Test {public static void main(String[] args)…Java 中有一个非常重要的内容是 try-catch-finally 的执行顺序和返回值问题其中 finally 一定会执行但是为什么会这样 下面看下 try-catch-finally 背后的实现原理 try-catch public class Test {public static void main(String[] args) {foo();}public static void foo() {try {int i 1 / 0;}catch (Exception e){System.out.println(执行异常);e.printStackTrace();}}} 字节码 public class com.yxzapp.Test {public com.yxzapp.Test();Code:0: aload_01: invokespecial #1 // Method java/lang/Object.init:()V4: returnpublic static void main(java.lang.String[]);Code:0: invokestatic #2 // Method foo:()V3: returnpublic static void foo();Code:0: iconst_1 // 将int 类型值1压栈到栈顶1: iconst_0 // 将int 类型值0压栈到栈顶2: idiv // 将栈顶两int型数值相除并将结果压入栈顶3: istore_0 // 将栈顶类型int数据存储到局部变量表下标04: goto 20 // 如果不抛异常跳到20行7: astore_0 // 将引入对象异常对象存储局部变量表下标08: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;11: ldc #5 // String 鎵ц寮傚父13: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V16: aload_017: invokevirtual #7 // Method java/lang/Exception.printStackTrace:()V20: returnException table:from to target type0 4 7 Class java/lang/Exception } 17 4: goto 20 // 如果不抛异常跳到20行 如果有异常抛出如何处理呢 当方法包含 try-catch 语句时在编译单元生成的方法的 Code 属性中会生成一个异常表 Exception table, 每个异常项表示一个异常处理器 由 from 指针 、to 指针、target 指针 、所捕获的异常类型 type 四部分组成。这些指针的值是字节码索引用于定位字节码。其含义是在 [from ,to) 字节码范围内如果跑出来异常类型为 type 的异常就会跳转到 target 指针表示的字节码处继续执行。 上面的例子中 Exception table表示在 0 - 4 之间不包含4如果抛出类型为 Exception 或其子类就跳转到7继续执行 当抛出异常时Java 虚拟机会自动将异常对象加载到操作数栈栈顶 多try-catch public class Test {public static void main(String[] args) {foo();}public static void foo() {try {int i 1 / 0;}catch (ArithmeticException e){System.out.println(执行异常 ArithmeticException);e.printStackTrace();} catch (NullPointerException e){System.out.println(执行异常 NullPointerException);e.printStackTrace();}}} 字节码 public class com.yxzapp.Test {public com.yxzapp.Test();Code:0: aload_01: invokespecial #1 // Method java/lang/Object.init:()V4: returnpublic static void main(java.lang.String[]);Code:0: invokestatic #2 // Method foo:()V3: returnpublic static void foo();Code:0: iconst_11: iconst_02: idiv3: istore_04: goto 367: astore_08: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;11: ldc #5 // String 鎵ц寮傚父 ArithmeticException13: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V16: aload_017: invokevirtual #7 // Method java/lang/ArithmeticException.printStackTrace:()V20: goto 3623: astore_024: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;27: ldc #9 // String 鎵ц寮傚父 NullPointerException29: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V32: aload_033: invokevirtual #10 // Method java/lang/NullPointerException.printStackTrace:()V36: returnException table:from to target type0 4 7 Class java/lang/ArithmeticException0 4 23 Class java/lang/NullPointerException } 可以看到 多一个 catcha 语句处理分析 异常表里面就会多一条记录当程序出现异常时 Java 虚拟机会从上至下遍历异常表中所有的条目。当触发异常的字节码索引值在某个条目的 [from 、to范围内则会判断抛出的异常是否是想捕获的异常或子类 如果异常匹配 Java 虚拟机将控制跳转到 target 指向的字节码继续执行如果不匹配则继续遍历异常表。如果遍历完所有的异常表还未找到匹配的异常处理器那么该异常将继续抛到调用方 caller中重复上述的操作 try-catch-finally public class Test {public static void main(String[] args) {foo();}public static void foo() {try {int i 1 / 0;}catch (ArithmeticException e){System.out.println(执行异常 ArithmeticException);e.printStackTrace();} finally {System.out.println(执行);}}} 字节码 public class com.yxzapp.Test {public com.yxzapp.Test();Code:0: aload_01: invokespecial #1 // Method java/lang/Object.init:()V4: returnpublic static void main(java.lang.String[]);Code:0: invokestatic #2 // Method foo:()V3: returnpublic static void foo();Code:0: iconst_1 // 将int 类型值1压栈到栈顶1: iconst_0 // 将int 类型值0压栈到栈顶2: idiv // 将栈顶两int型数值相除并将结果压入栈顶3: istore_0 // 开始执行 finally 代码块4: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;7: ldc #4 // String 鎵ц9: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V12: goto 5015: astore_0// 异常被catch情况下开始执行 finally 代码块16: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;19: ldc #7 // String 鎵ц寮傚父 ArithmeticException21: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V24: aload_025: invokevirtual #8 // Method java/lang/ArithmeticException.printStackTrace:()V28: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;31: ldc #4 // String 鎵ц33: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V36: goto 5039: astore_1// 异常catch中执行出现异常代码块出现异常 情况下开始 执行 finally 代码块40: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;43: ldc #4 // String 鎵ц45: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V48: aload_149: athrow50: returnException table:from to target type0 4 15 Class java/lang/ArithmeticException0 4 39 any15 28 39 any } 可以看出字节码中 出现三次调用 getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;ldc #4 // String 鎵цinvokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V都是在程序正常 return 和异常 throw 之前其中两处在 try-catch 语句调用 return 之前一处是在异常抛出 throw 之前 由代码可知现在的 Java 编译器采用复制 finally 代码块的方式并将其内容插入到 try 和 catch 代码块中所有正常退出和异常退出之前。这样就解释了我们一直以来所熟知的 finally 语句块一定会执行
http://www.hkea.cn/news/14291136/

相关文章:

  • 网站运营经理岳阳卖房网站
  • wordpress网站的根目录在哪口碑好的聊城网站建设
  • 可以注册邮箱的网站开封建设网站
  • 济宁培训网站建设企业网站制作前期需要什么资料
  • 哪个网站推广比较好宣传片拍摄报价明细
  • 方太网站谁做的远程教育网站建设方案
  • 山东天成水利建设 网站自己怎么制作网站
  • 西安手机网站开发精品课程网站开发项目
  • 什么什么设计英文网站站长工具收录查询
  • 濮阳做网站的专业型企业网站有哪些
  • 做网站时 404网页如何指向深圳关键词推广
  • 大型网站建设推广名校建设专题网站
  • 如何做网站焦点图佛山网站建设网站
  • 避免网站侵权注册1000万公司每年费用多少
  • 记事本做网站怎么调整图片间距写软文的app
  • 郑州网站设计 公司网站网站开发软件
  • 网上做家教哪个网站微信开发公众平台
  • 东莞网站制作方案定制外贸假发网站
  • 青岛建设网站企业淘宝客不建网站怎样做
  • 网区建站产品设计工程师
  • 电子商务网站建设报告分析vi平面设计公司
  • 网站建设与管理 教学视频开封市建设银行网站
  • 德宏做网站wordpress3.8.1下载
  • 小型网站建设价格长沙做网站建设的
  • 互联网网站建设一条龙服务wordpress调用用户名密码
  • 建设工程规划许可证网站国外网站怎么上
  • 以前做视频的网站吗淘宝上面如何做网站
  • 宝安做棋牌网站建设找哪家公司好自己做的网站收费
  • phpcms 网站根目录三里河网站建设
  • 请人制作一个网站需要多少钱jquery插件网站推荐