当前位置:网站首页>昨天面试居然聊了半个多小时的异常处理
昨天面试居然聊了半个多小时的异常处理
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高级特性与实践》
边栏推荐
- pdb符号库文件详解
- 项目管理复习题
- Cisco simulator simple campus network design, final assignment difficulty
- 自主可控再下一城!首套国产ARTIQ架构量子计算测控系统发布
- C language__ VA_ ARGS__ Usage of
- Detailed explanation of C language pointer
- Create an API rapid development platform, awesome!
- leetcode 903. Effective arrangement of Di sequences
- weserver發布地圖服務
- Another "provincial capital university", coming!
猜你喜欢
![[cloud resident co creation] break through the performance bottleneck of image recognition through rust language computing acceleration technology](/img/1a/c5e1e17d057c8b4ba2e57f28237498.png)
[cloud resident co creation] break through the performance bottleneck of image recognition through rust language computing acceleration technology

Qitai observation: professional elites must step on the huge pit of entrepreneurship - learning effect pit

云原生(三十一) | Kubernetes篇之Kubernetes平台基本预装资源

Xiaobai learns MySQL - incremental statistical SQL requirements - windowing function scheme

Write it down once Net analysis of a property management background service stuck

【毕业季·进击的技术er】1076万毕业生,史上最难就业季?卷又卷不过,躺又躺不平,敢问路在何方?

【云驻共创】通过Rust语言计算加速技术突破图片识别性能瓶颈
![[graduation season] it's worth it all the way over the past four years -- advice from the senior students](/img/26/d6363603ff57730970497789a05265.png)
[graduation season] it's worth it all the way over the past four years -- advice from the senior students

Technology sharing | broadcast function design in integrated dispatching

Mondo rescue creates an image file (which is conducive to image damage recovery)
随机推荐
Basic type variable declaration
iMile 利用 Zadig 多云环境周部署千次,跨云跨地域持续交付全球业务
华为机器学习服务语音识别功能,让应用绘“声”绘色
C语言字符函数
Notimplementederror: numpy() is only available when Eagle execution is enabled
Why is the integration of storage and computing a new direction of core making Collision school x Zhicun Technology
Netdata mail alarm configuration
Rslo: self supervised lidar odometer (real time + high precision, icra2022)
C语言模拟实现所有字符函数
[system design] proximity service
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
Xiaobai learns MySQL - incremental statistical SQL requirements - windowing function scheme
成功解决ValueError: Only TF native optimizers are supported in Eager mode
Koa2+better-sqlite3 to add, delete, change and query
Cvpr2022 | panopticdepth: a unified framework for depth aware panoramic segmentation
开户可以在网上开么?能安全吗
Redis deletion policy and eviction algorithm
Is it safe to open an account online?
Prometheus 2.28.0 新特性
在线文本过滤小于指定长度工具