读本篇文章之前,如果让你叙述一下 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

二、对比一个 Error 和 Exception

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

NoClassDefFoundError 和 ClassNotFoundException 有什么区别?

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

进一步的:

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);
}
}

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 的区别」你心里有数了么?

【Java面试指北】Exception Error Throwable 你分得清么?的更多相关文章

  1. Java面试指北!13个认证授权常见面试题/知识点总结!| JavaGuide

    大家好,我是 Guide哥!端午已过,又要开始工作学习啦! 我发现有很多小伙伴对认证授权方面的知识不是特别了解,搞不清 Session 认证.JWT 以及 Cookie 这些概念. 所以,根据我根据日 ...

  2. Java异常处理总结Exception\Error

    Java异常处理总结Exception\Error 2012-12-28 08:17:17|  分类: JAVA |  标签:java  |举报|字号 订阅   Java异常处理总结          ...

  3. Atitit java的异常exception 结构Throwable类

    Atitit java的异常exception 结构Throwable类 1.1. Throwable类 2.StackTrace栈轨迹1 1.2. 3.cause因由1 1.3. 4.Suppres ...

  4. 2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧!

    2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧! http://blog.zh66.club/index.php/archives/116/

  5. JSON parse error: default constructor not found. class java.time.YearMonth; nested exception is com.alibaba.fastjson.JSONException: default constructor not found. class java.time.YearMonth

    java8新出的YearMonth可以方便的用来表示某个月.我的项目中使用springmvc来接收YearMonth类型的数据时发现 x-www-from-urlencoded 格式的数据可以使用&q ...

  6. 慕课网:剑指Java面试-Offer直通车视频课程

    慕课网:剑指Java面试-Offer直通车视频课程,一共有10个章节. 目录结构如下: 目录:/2020036-慕课网:剑指Java面试-Offer直通车 [6G] ┣━━第10章 Java常用类库与 ...

  7. 转:最近5年133个Java面试问题列表

    最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...

  8. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  9. java面试宝典(蓝桥学院)

    Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围 ...

  10. java面试和笔试大全 分类: 面试 2015-07-10 22:07 10人阅读 评论(0) 收藏

    2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...

随机推荐

  1. typora收费了,最后一个免费版提供下载

    typora收费了,在这里,博主提供最后一个免费版下载,地址如下,顺便把typora导入和导出word时需要的工具也一同提供.最看不惯免费用着别人的软件,还搞引流的垃圾网站和公众号.地址如下 http ...

  2. MySQL数据库中配置文件 read_only 参数的有关说明

    1.对于MySQL单实例数据库和master库,如果需要设置为只读状态,需要进行如下操作和设置: 将MySQL设置为只读状态的命令(可以登录mysql执行下面命令, 或者在my.cnf配置文件中添加& ...

  3. 使用python连接elasticsearch

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/overview.html 安装的时候注意 ...

  4. Debian+Wine For Termux,兼容Windows on arm的安卓手机子系统!

    如果已经安装了termux,先删掉. 安装方法 下载安装我提供的termux 链接: https://pan.baidu.com/s/13hbp6igps18V2RJcOxgQIg 提取码: 1irn ...

  5. [CG从零开始] 4. pyopengl 绘制一个正方形

    在做了 1-3 的基础工作后,我们的开发环境基本 OK 了,我们可以开始尝试利用 pyopengl 来进行绘制了. 本文主要有三个部分 利用 glfw 封装窗口类,并打开窗口: 封装 shader 类 ...

  6. python-数据描述与分析2(利用Pandas处理数据 缺失值的处理 数据库的使用)

    2.利用Pandas处理数据2.1 汇总计算当我们知道如何加载数据后,接下来就是如何处理数据,虽然之前的赋值计算也是一种计算,但是如果Pandas的作用就停留在此,那我们也许只是看到了它的冰山一角,它 ...

  7. SSM项目环境快速搭建

    SSM项目的环境搭建 环境搭建的目标 工程创建 创建父工程 创建空 maven工程 xxx-parent 作为父工程 修改父工程中的 pom.xml <!--?xml version=" ...

  8. 开源动态可监控线程池DynamicTp介绍

    前言 使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢? 代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适 凭经验设置参数值, ...

  9. 齐博x1内容评论标签的风格制作

    评论的标签如下: {qb:comment name="xxxxx" rows='5'} HTML代码片段 {/qb:comment} 评论涉及到的元素有{posturl} 这个是代 ...

  10. 网络工程知识(二)VLAN的基础和配置:802.1q帧;Access、Trunk、Hybrid接口工作模式过程与配置;VLANIF的小实验

    介绍-VLAN VLAN(Virtual Local Area Network)即虚拟局域网,工作在数据链路层. 交换机将通过:接口.MAC.基于子网.协议划分(IPv4和IPv6).基于策略的方式划 ...