【Java面试指北】Exception Error Throwable 你分得清么?

news2024/12/23 19:25:49

读本篇文章之前,如果让你叙述一下 Exception Error Throwable 的区别,你能回答出来么?
你的反应是不是像下面一样呢?

  • 你在写代码时会经常 try catch(Exception)
  • 在 log 中会看到 OutOfMemoryError
  • Throwable 似乎不常见,但也大概听说过

一、Exception Error Throwable 关系

直接看下图,展示了三者之间的关系:

  • ThrowableErrorException 的父类。
  • Exception是程序正常运行中可预料的正常情况,应该被捕获并进行处理。
    • 又分为**可检查(checked)不检查(unchecked)**异常。
    • 可检查异常是在编译期检查的一部分,必须显示捕获处理。如有的方法 throw exception,那么调用该函数则必须 catch 处理或者再次 throw 出去交给下一层处理。
    • 不检查异常一般指运行时异常(RuntimeException),类似 ArrayIndexOutOfBoundsExceptionArithmeticException等。一般可由代码逻辑避免,可看情况是否捕获。
  • Error 一般是正常情况下不太可能出现的,绝大部分 Error 会导致程序处于不可恢复的状态,所以也不必捕获。如 OutOfMemoryError

image.png

二、对比一个 Error 和 Exception

你在面试中也许会被问到:

NoClassDefFoundError 和 ClassNotFoundException 有什么区别?

首先,我们看这俩名字,一个是 Error 另一个是 Exception,从上面的介绍以及看下面的继承图可以得到:ClassNotFoundException 应是编码时要被捕获的异常,NoClassDefFoundError 是编译通过了,但运行时产生的重大问题。
image.png

进一步的:
ClassNotFoundException 是运行中动态加载类时出现的问题。
举例来说,使用 Class.forName 来动态加载一个类,如果你不显示的 catch 处理,ide 都会给你提示,并且也过不了编译。

// 错误写法
public void except() {
    Class.forName("com.test.aaa");
}

// 正确写法
public void except() {
    try {
        Class.forName("com.test.aaa");
    } catch (ClassNotFoundException e) {
        // throw or log
        throw new RuntimeException(e);
        // log.error("ClassNotFoundException: ", e);
    }
}

image.png

NoClassDefFoundError 是编译时没问题,但运行时 new 实例找不到。
比如在一个类中引用另一个类的函数,编译后把另一个类的 class 文件删掉:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        MyPrint.printName();
    }
}
public class MyPrint {
    public static void  printName() {
        System.out.println("my name is zhangsan");
    }
}

使用 javac 编译,再删除 MyPrint.class

$ tree com
com
└── shuofxz
    ├── Main.class
    ├── Main.java
    ├── MyPrint.class  # 把这个文件删掉
    └── MyPrint.java

执行程序,就会看到 NoClassDefFoundError,并且是由 ClassNotFoundException 引起的。

Exception in thread "main" java.lang.NoClassDefFoundError: com/shuofxz/MyPrint
	at com.shuofxz.Main.main(Main.java:6)
Caused by: java.lang.ClassNotFoundException: com.shuofxz.MyPrint
	at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
	... 1 more

三、捕获异常代码常见问题

一)看下面的代码有什么问题?

try {
  // 业务代码
  // ...
  Thread.sleep(1000L);
} catch (Exception e) {
}
  • 捕获了过于通用的异常 Exception,应改为对应的 InterruptedException。这么做的目的是因为:第一方便阅读代码,知道可能会出现什么具体的异常;第二不捕获意料之外的异常。
  • 不要捕获异常之后啥都不做(生吞异常)。这就是给自己挖坑,之后程序遇到问题,你很难定位到这里。

二)再看下面这个,增加了异常打印逻辑,还有什么问题不?

try {
    // 业务代码
    // …
} catch (IOException e) {
    e.printStackTrace();
}
  • 自娱自乐是 ok 的,但不要放到生产环境中。因为 e.printStackTrace() 的功能是:Prints this throwable and its backtrace to the **standard error stream。**你很难判断它到底输出到哪里去了。
  • 应该用成熟的日志工具如 Slf4j 等。

三)再来看下面的:

try {
    // 业务逻辑 A
    // 业务逻辑 B
    // 业务逻辑 C
    // ...
} catch (Exception e) {
    log.error("have exception", e);
}
  • 不能因为怕丢失异常捕获,就把一大段代码都框到一个 try-catch 模块中。
  • try-catch 代码段会产生额外的性能开销,它往往会影响 JVM 对代码进行优化。

四)我们前面介绍了Exception、Error、Throwable,为什么代码中经常能看到 catch XXException,却几乎看不到 catch XXErrorcatch Throwable 呢?

  • Exception 才是你应该关注处理的异常,这种异常处理后还可以使程序正常运行。
  • Error 属于重大问题,是会使程序直接崩溃的,你捕获了也没什么用,很难让程序再「活」过来。
  • 至于 Throwable,首先不应该不过这么宽泛的问题(比捕获 Exception 还严重),第二其中包含了 Error 也不是你应该处理的问题。
  • 因此,Error 和 Throwable 除非你明确知道你在干什么,否则不要捕获这两种。

三、小结

本篇介绍了 Exception Error Throwable 的区别,并给出了相关例子帮助理解。
回到开头的问题:「叙述一下 Exception Error Throwable 的区别」你心里有数了么?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么大部分人做网赚是赚不到钱的,这才是真正的原因!

说实话,互联网已经发展到现在的水平,目前来看,互联网上只存在两种平台,一种是社交平台,一种是内容平台。 所有的抖音、知乎、小红书、搜索引擎、淘宝等等这些都是内容平台,如果你想要解决精准流量问题&…

JSP+MySQL基于SSM的高校毕业生就业管理系统

本高校毕业生就业管理系统主要包括系统用户管理模块、招聘信息管理模块、简历接收管理、投递简历管理、登录模块、和退出模块等多个模块。它帮助高校毕业生就业管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了高校毕业生就业管理…

配电网重构|基于新颖的启发式算法SOE的随机(SDNR)配电网重构(Matlab代码实现)【算例33节点、84节点、119节点、136节点、417节点】

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 📝目前更新:🌟🌟🌟电力系统相关知识,期刊论文&…

【数据集NO.3】人脸识别数据集汇总

文章目录前言一、IMDB-WIKI人脸数据集二、WiderFace人脸检测数据集三、GENKI 人脸图像数据集四、哥伦比亚大学公众人物脸部数据库五、CelebA人脸数据集六、美国国防部人脸库七、MTFL人脸识别数据集八、BioID人脸数据集九、PersonID人脸识别数据集十、CMU PIE人脸库十一、Youtub…

Linux虚拟内存

问题 什么是虚拟内存地址 ?Linux 内核为啥要引入虚拟内存而不直接使用物理内存 ?虚拟内存空间到底长啥样?内核如何管理虚拟内存?什么又是物理内存地址 ?如何访问物理内存? 什么是虚拟内存地址 举一个生活…

Redis学习笔记(四)

事务 一个命令执行的队列,中间不会被打断或者干扰基本操作、 开启事务:multi 作用:设定事务的开启位置,执行此命令后,后续所有指令均加入事务中 执行事务:exec 作用:设定事务结束的位置&#xf…

【MySQL】表的增删改查(一)

你可以了解世间万物,但追根溯源的唯一途径便是亲身尝试。——《心灵捕手》 前言: 大家好,我是拳击哥,今天给大家讲解的是mysql表GRUD操作中的新增数据、查询数据以及表中数据的排序、去重等。因篇幅过长,分为两期来讲解…

Linux——匿名管道、命名管道及进程池概念和实现原理

目录 一.什么是匿名管道 二.如何使用匿名管道 (一).pipe原理 (二).pipe使用 三.命名管道概念及区别 (一).什么是命名管道 (二).与匿名管道的联系和区别 四.命名管道的使用 &…

Python——分支语句

1.bool 数据类型:真和假,只有两个值,就是True和False。 2.if语句使用的语法: 3.else语句:(同上) 4.比较运算符: a b:a和b是否相等 a ! b: a和b是否不相等 a…

【网络层】子网划分、无分类编址CIDR、构成超网、ARP协议

注:最后有面试挑战,看看自己掌握了吗 文章目录子网划分-----减少浪费IP----两级IP不够灵活-----变三级IP地址-----对外还是表现以前的网络号---------只是拿出部分主机号来做子网号子网划分实例-------对外不展示内部的子网划分----子网掩码---与运算---…

什么是【固件】?

文章目录一、软件 硬件 固件二、BIOS(Basic Input/output System)三、百度百科的解释四、固件的工作原理五、应用六、参考链接一、软件 硬件 固件 通常我们会将硬件和软件分开看待,二者协同工作为我们提供计算机的体验。硬件是摸得着的实体&…

[附源码]计算机毕业设计学生宿舍维修管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

假设检验(1)-假设检验的基本概念

数理统计的另一基本任务是对总体参数作某种假设,然后根据所得的样本,运用统计分析的方法来检验这一假设是否成立,从而作出接受或拒绝的决定. 这就是假设检验问题. 3. 1. 1 假设检验的基本思想和推理方法 我们先举一个…

C\C++刷题DAY5

目录 1.第一题 2.第二题 3.第三题 1.第一题 160. 相交链表 - 力扣(LeetCode) 思路分析: 看链表相不相交,是看链表的地址。把两个链表的地址一一比对,如有有相同的地址,那么相交,如果各不相同…

详解自监督发展趋势! 何恺明连获三年CVPR最高引用的秘诀是?

点击文末公众号卡片,不错过计算机会议投稿信息 0 引言 许多加了我好友的读者知道尼谟之前的研究方向是“自监督学习”,而最近我无意中发现,CVPR最近三年引用量最高的论文竟然都是来自监督学习领域的,且三篇论文的作者都包括Face…

(四)进程管理:进程基本概念

文章目录一. 进程的概念二. 进程的结构和特征1. 进程的结构2. 进程的特征三. 进程与【线程】1. 进程与线程的关系与区别2. 线程的实现方式1. 纯用户级方式(淘汰)2. 纯内核级方式3. 组合方式一. 进程的概念 进程(Process)&#xff…

C#,彩色图片转为灰度图的快速算法与源代码

彩色图转为灰度图的场景非常多,比如人工智能的训练与识别时,需要将彩色图片转为灰度图。 以下文字来自于: 彩色图像转灰度图像原理python_蜗牛的笨笨的博客-CSDN博客_python 彩色图转灰度图现在我们所接触到的图像绝大多数都是数字图像&…

[附源码]计算机毕业设计springboot疫情背景下社区互助服务系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

u-boot常用命令

u-boot常用命令查看u-boot所支持的命令查询命令u-boot版本环境变量板子相关信息环境变量操作内存操作网络操作EMMC和 SD卡操作FAT 格式文件系统操作EXT格式文件系统操作ubi格式文件系统操作boot 操作bootzbootmbootUMS 命令常用其他uboot环境变量:bootcmd和bootargs…

python基础语法15-网络编程理论

网络编程是指在程序中实现两台计算机之间的通信。 Python提供了大量的内置模块和第三方模块用于支持各种网络访问,而且Python语言在网络通信方面的优点特别突出,远远领先其他语言。 一、IP: 1.概念: IP:互联网协议地址(Internet Protocol Add…