当前位置:网站首页>昨天面试居然聊了半个多小时的异常处理
昨天面试居然聊了半个多小时的异常处理
2022-06-29 12:44:00 【51CTO】
大风吹去了往日的雾霾,阳光透过窗户照进来,透过窗户可以看到远处的山脉与蓝天相接,这可比我那永远见不到阳光的出租屋好多了。渐渐走进的脚步声打断了我的思绪,一位小姐姐坐在了面前,甜甜的香水味立刻钻进了我的鼻孔。
小姐姐微笑地说:”您好,我是今天的面试官,那么开始吧?“

我收起直勾勾的眼睛,说:“好的。”
小姐姐说:“在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 指针指向的字节码。
小姐姐说:“有点抽象,可以举个例子吗?”
“当然可以。”我一边说,一边在纸上写了起来:
这段代码的 main 方法中,我定义了一段try 和catch 代码。编译过后的字节码中,这个方法的异常表拥有一个记录:
其from指针和to指针分别为 3 和 6,代表它的监控范围从索引为 3 的字节码开始,到索引为 6 的字节码结束(不包括 6)。该记录的 target 指针是 9,代表这个异常处理从索引为 9 的字节码开始。该记录的最后一列,代表该异常处理所捕获的异常类型是Exception。
当触发异常的字节码的索引值在 3 和 6 之间时,Java虚拟机会判断所抛出的异常是否时Exception。如果是,控制流转将会移至索引为 9 的字节码开始执行。
小姐姐满意地说:“很好,我去叫HR和你聊聊,如果顺利的话,今天就可以发offer。”
参考文献:
《Java编程思想》
《Java核心技术》
《深入理解Java虚拟机:JVM高级特性与实践》
边栏推荐
- Want to make a wechat game for answering questions? Reading this article is enough
- 编写一个shell脚本,求一个数的”逆序数“
- Server monitoring netdata panel configuring mail service
- Memorized Function
- Getting started with mybaits (including example tutorial and source code)
- Weserver publishing map service
- win32版俄罗斯方块(学习MFC必不可少)
- PG Basics - logical structure management (1)
- Weserver Publishing Map Service
- grep 精确匹配
猜你喜欢

C language character function

Lecun published a research plan for the next decade: AI autonomous intelligence with a 62 page paper

Hundreds of CVPR people were recruited as new champions. Emoji became a "court witness". M2 MBP was exposed that the hard disk speed was reduced. Today, more big news is here

韩国AI团队抄袭震动学界!1个导师带51个学生,还是抄袭惯犯

Repoptimizer: it's actually repvgg2

Proteus simulation of buck switching power supply based on 51 single chip microcomputer

mysql调优

华为机器学习服务语音识别功能,让应用绘“声”绘色

Huawei machine learning service speech recognition function enables applications to paint "sound" and color

DeeCamp2022正式开营!李开复、张亚勤亲授大师课 | 创新事
随机推荐
Deecamp2022 officially opened! Likaifu and zhangyaqin personally teach master courses 𞓜 innovation
Three best practices help enterprises improve supply chain security
php-fpm 启动参数及重要配置详解
技术分享| 融合调度中的广播功能设计
记一次 .NET 某物管后台服务 卡死分析
How can the sports app keep the end-to-side background alive to make the sports record more complete?
GBase8s数据库遇到951错误是什么原因?
B+ tree | MySQL index usage principle
AOSP ~ logcat persistence
koa2+better-sqlite3实现增删改查
leetcode 522. Longest special sequence II
DeeCamp2022正式开营!李开复、张亚勤亲授大师课 | 创新事
Redis deletion policy and eviction algorithm
*Clock in algorithm *leetcode 146 Analysis of LRU cache algorithm
AOSP ~ initialization language
GEE——美国LANDFIRE火灾数据集
Is it safe to open an account online?
[cloud resident co creation] break through the performance bottleneck of image recognition through rust language computing acceleration technology
Ordinary users use vscode to log in to SSH and edit the root file
Aurora · Huffman tree generation (segment tree structure non pointer) (imitating adjacency table)