美文网首页
昨天的面试官居然是位小姐姐,聊了半个多小时的异常处理

昨天的面试官居然是位小姐姐,聊了半个多小时的异常处理

作者: 万猫学社 | 来源:发表于2022-04-09 22:56 被阅读0次

大风吹去了往日的雾霾,阳光透过窗户照进来,透过窗户可以看到远处的山脉与蓝天相接,这可比我那永远见不到阳光的出租屋好多了。渐渐走进的脚步声打断了我的思绪,一位小姐姐坐在了面前,甜甜的香水味立刻钻进了我的鼻孔。

小姐姐微笑地说:”您好,我是今天的面试官,那么开始吧?“

我收起直勾勾的眼睛,说:“好的。”

小姐姐说:“在Java的异常处理中有两大组成要素:抛出异常和捕获异常。那么抛出异常可以分为哪两种呢?”

我立刻回答到:

抛出异常可以分为显式和隐式。显式抛异常是在代码中使用throw关键字手动将异常实例抛出。隐式抛异常是 Java 虚拟机在执行过程中,遇到无法继续执行的异常状态,自动将异常实例抛出,比如我们经常遇到的空指针异常(NullPointerException)。

小姐姐说:“很好,那么捕获异常中经常用到哪些关键字呢?”

我立刻回答到:

我们一般用到trycatchfinally等关键字。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 方法中,我定义了一段trycatch 代码。编译过后的字节码中,这个方法的异常表拥有一个记录:

public static void main(java.lang.String[]);
  descriptor: ([Ljava/lang/String;)V
  flags: ACC_PUBLIC, ACC_STATIC
  Code:
    stack=1, locals=3, args_size=1
       0: ldc           #2                  // String 万猫学社
       2: astore_1
       3: ldc           #3                  // String try
       5: astore_1
       6: goto          13
       9: astore_2
      10: ldc           #5                  // String catch
      12: astore_1
      13: return
    Exception table:
       from    to  target type
           3     6     9   Class 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高级特性与实践》

最后,谢谢你这么帅,还给我点赞关注

相关文章

  • 昨天的面试官居然是位小姐姐,聊了半个多小时的异常处理

    大风吹去了往日的雾霾,阳光透过窗户照进来,透过窗户可以看到远处的山脉与蓝天相接,这可比我那永远见不到阳光的出租屋好...

  • Day38夸夸群女王花花的日记

    今天一天真的是开心的一天 昨天约了一位70后,已经做了奶奶的姐姐今天上午语音电话 我们聊了半个多小时,因为几年前她...

  • 10/100|抬头看路,同时也要低头走路

    事件 今天休息一天,整理了大半天笔记和知识,下午找师姐搭桥认识的也是会计出身的青云姐姐聊了半个多小时,晚上也是在姐...

  • 2020-08-24

    昨天跟姐姐聊天,聊了一个多小时,谈及了借钱这回事。姐姐说有人跟她借钱,不借吧,面子上过不去,借了呢,又不是滋味。她...

  • 再来长沙,熟悉又陌生的城市

    昨天来到长沙举行了最后一次面试,跟面试官一起聊了一个多小时吧,现在等结果的我,在长沙随意的逗留着,住在朋友的房间里...

  • 一个姑娘走进我的视线

    前段时间机缘巧合认识一个小姐姐,像老朋友一样微信语音聊了半个多小时,人与人的缘分就是这么的奇妙。有时候我比较相...

  • 符合人性的规律,才是行走世界的正途!

    文/闪闪发光的沙子 1. 昨天晚上刷朋友圈,看到一个认识2年的朋友发的内容,突然来了兴趣,和她聊了半个多小时。朋友...

  • 听君一席话,胜读十年书

    今天和一位网友姐姐(静修浮沉)聊了将近半个小时,姐姐的一席话,让我茅塞顿开,解决了困扰我二十多年的烦恼。 静修浮沉...

  • 8月18日

    昨天和乐乐聊了半个多小时,关于学习,我不断的帮他分析高考的突破点,不禁去感叹,当年没有人和自己说过同样的话。老爸会...

  • 记忆深处,童年未满

    妈妈昨天回老家给爷爷和外公上坟,晚上在电话中兴奋的和我聊了半个多小时,说起了长久以来未曾有过的轻松自在,说起了雨后...

网友评论

      本文标题:昨天的面试官居然是位小姐姐,聊了半个多小时的异常处理

      本文链接:https://www.haomeiwen.com/subject/nyvbsrtx.html