昨天的面试官居然是位小姐姐,聊了半个多小时的异常处理
大风吹去了往日的雾霾,阳光透过窗户照进来,透过窗户可以看到远处的山脉与蓝天相接,这可比我那永远见不到阳光的出租屋好多了。渐渐走进的脚步声打断了我的思绪,一位小姐姐坐在了面前,甜甜的香水味立刻钻进了我的鼻孔。
小姐姐微笑地说:”您好,我是今天的面试官,那么开始吧?“
我收起直勾勾的眼睛,说:“好的。”
小姐姐说:“在Java的异常处理中有两大组成要素:抛出异常和捕获异常。那么抛出异常可以分为哪两种呢?”
我立刻回答到:
抛出异常可以分为显式和隐式。显式抛异常是在代码中使用throw
关键字手动将异常实例抛出。隐式抛异常是 Java 虚拟机在执行过程中,遇到无法继续执行的异常状态,自动将异常实例抛出,比如我们经常遇到的空指针异常(NullPointerException)。
小姐姐说:“很好,那么捕获异常中经常用到哪些关键字呢?”
我立刻回答到:
我们一般用到try
、catch
、finally
等关键字。try
被用来标记需要进行异常监控的代码;catch
被用来捕获在try
监控的代码中触发的某种指定类型的异常,还可以定义针对该异常类型进行如何处理;finally
被用来声明一段无论发生什么异常都必定运行的代码,它避免跳过某些关键的清理代码,比如:关闭已打开的IO资源。
小姐姐说:“很好,如果三个关键字一起使用,代码执行的顺序是什么样子的?”
我立刻回答到:
在正常执行的情况下,先执行try
中的代码再执行finally
中的代码。
如果try
中的代码触发异常,并且异常没有被捕获,finally
中代码会被直接执行,并且在执行之后重新抛出该异常;如果异常被catch
捕获,先执行catch
中的代码再执行finally
中的代码。
如果catch
中的代码也触发了异常,那么finally
中代码同样会被执行,并会抛出catch
代码触发的那个异常。如果finally
中的代码也触发了异常,那么会中断当前finally
代码的执行,并抛出异常。
小姐姐说:“很好,在Java虚拟机中,是通过什么方式实现异常处理?”
这个问题有点难度,我稍微思考了一下回答到:
主要是通过异常表。在编译生成的字节码中,每个方法都附带一个异常表。异常表中可能有多条记录,每一条记录都包括from
指针、to
指针、target
指针和所捕获的异常类型。这些指针的值是字节码索引(bytecode index),用于定位字节码。
其中,from
指针和to
指针表示异常处理监控的范围,比如: try
所覆盖的范围。target
指针指向异常处理代码的起始位置,比如:catch
代码的起始位置。
如果有异常触发时,Java虚拟机会从上至下遍历异常表中的所有记录。当触发异常的字节码的索引值在某个异常表记录的监控范围内,Java虚拟机会判断所抛出的异常和该记录想要捕获的异常是否匹配。如果匹配,控制流转将会移至该记录 target 指针指向的字节码。
小姐姐说:“有点抽象,可以举个例子吗?”
“当然可以。”我一边说,一边在纸上写了起来:
public class OneMore {public static void main(String[] args) {String str = "万猫学社";try {str = "try";} catch (Exception e) {str = "catch";}}}
这段代码的 main 方法中,我定义了一段try
和catch
代码。编译过后的字节码中,这个方法的异常表拥有一个记录:
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code:stack=1, locals=3, args_size=10: ldc#2 // String 万猫学社2: astore_13: ldc#3 // String try5: astore_16: goto 139: astore_2 10: ldc#5 // String catch 12: astore_1 13: retuException table:fromto target type3 6 9Class java/lang/Exception
其from
指针和to
指针分别为 3 和 6,代表它的监控范围从索引为 3 的字节码开始,到索引为 6 的字节码结束(不包括 6)。该记录的 target 指针是 9,代表这个异常处理从索引为 9 的字节码开始。该记录的最后一列,代表该异常处理所捕获的异常类型是Exception
。
当触发异常的字节码的索引值在 3 和 6 之间时,Java虚拟机会判断所抛出的异常是否时Exception
。如果是,控制流转将会移至索引为 9 的字节码开始执行。
小姐姐满意地说:“很好,我去叫HR和你聊聊,如果顺利的话,今天就可以发offer。”
参考文献:
《Java编程思想》
《Java核心技术》
《深入理解Java虚拟机:JVM高级特性与实践》
竟然已经看到这里了,你我定是有缘人,留下你的点赞和关注,他日必成大器。
微信公众号:万猫学社
微信扫描二维码
关注后回复「电子书」
获取12本Java必读技术书籍


出处:http://www.cnblogs.com/heihaozi/
版权声明:本文遵循CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接和本声明。
微信扫描二维码,关注万猫学社,回复「电子书」,免费获取12本Java必读技术书籍。
作者:万猫学社
来源链接:https://www.cnblogs.com/heihaozi/p/15983819.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。