您的位置 首页 java

Java的异常体系,我们来全面描述一下,让你面试不愁

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工


前言

小伙伴们对 Java 的异常应该是不陌生的 ,不过很多人只是 简单的应用而已 ,而没有全面的,整体的去了解 Java的异常体系 。今天老顾就来跟大家一起 学习JAVA的异常

3W原则

哪都有的3W原则,JAVA异常也可以总结 3W:what、where、why

异常体系

Java的异常体系,我们来全面描述一下,让你面试不愁

上图我们看出Throwable是异常的顶级类, Error和Exception是他的子类

Exception又分 RuntimeException和非RuntimeException子类

Error与Exception区别

我们看一下他们的概念定义:

Error:程序无法处理的系统错误,编译器不做检查。

Error表示系统致命的错误,程序没法处理。一般是与 JVM 相关的问题 ,如 系统崩溃,内存溢出,方法调用 栈溢出 等,如:经常遇到的 StackOverflowError、OutOfMemoryError 。这种类型的错误, 编译器不做检查 ,都是系统运行过程中发生的。

这些错误靠我们 程序本身是无法处理与预防的 ,遇到了建议直接程序中止、重启。

Exception:程序可以处理的异常,捕获后可处理。

Exception异常是程序 能够捕获的,也可以做异常处理 ,我们要 尽可能的去处理 ,使程序继续运行,而不是中止程序。

总结一下就是Error是程序无法处理的错误,Exception是可以处理的异常。

RuntimeException与否区别

Java的异常体系,我们来全面描述一下,让你面试不愁

上图中Exception有两种类型的异常,我们来看一下

RuntimeException:不可预知的,程序应当自行避免

何为不可预知?如: 数组下标越界,访问对象空指针等 ,这种异常是我们小伙伴们在编写程序时要尽量避免。也就是 我们程序员是能够避免的

如针对空指针异常,我们应该在编程的时候, 加上空指针判断,if(obj == null) 如何如何,这样就避免了空指针异常。

非RuntimeException:可预知的,编译器可检查的异常

可预知,如:在我们打开一个文件时,如文件不存在引用的异常。

这种异常 编译器会检查出来,必须需要处理的

这个也称之为Checked Exception异常类型

责任归属

我们从责任角度看

1、Error属于JVM需要承担的责任

2、RuntimeException是程序应该承担的责任

3、非RuntimeException(CheckedException)可检查异常是JAVA编译器应该承担的责任

上面代码直观一点:

Java的异常体系,我们来全面描述一下,让你面试不愁

们看到 Error和RuntimeException编译器是不检查 的,而 CheckedExcepton异常编译器是检查 的,也就是我们 程序员是必须要捕获处理 的。那怎么处理呢?

1、try-catch方式

Java的异常体系,我们来全面描述一下,让你面试不愁

用try-catch方式捕获这个异常,可以在 catch代码段进行异常逻辑处理 ,这个就按照实际业务而定。如上图代码是FileNotFound异常,根据这个类型我们就知道是 文件句柄 不存在,那我们应该做哪些处理。如:提示一下用户该文件不存在

2、上抛异常方式

在复杂的业务中,我们的 程序员自己写的模块 ,很有可能 被其他程序员写的模块进行引用 ,为了能够让 其他程序员知道我们模块的异常,并要他们要进行处理 ,我们就可以采用上抛异常方式

Java的异常体系,我们来全面描述一下,让你面试不愁

我们看一下上层调用的处理

Java的异常体系,我们来全面描述一下,让你面试不愁

我们看到上抛异常, 是需要调用方进行处理的 。那 处理的方式是什么 呢?其实就是上面讲的try-catch或继续上抛。

常见的Error和Exception

一、RuntimeException

1、NullPointerException – 空指针引用异常

2、ClassCastException – 类型强制转换异常

3、IllegalArgumentException – 传递非法参数异常

4、IndexOutOfBoundsException – 下标越界异常

5、NumberFormatException – 数字格式异常

二、非RuntimeException

1、ClassNotFoundException – 找不到指定class异常

2、IOException – IO操作异常

三、Error

1、NoClassDefFoundError – 找不到class定义的异常

2、StackOverflowError – 深递归导致栈被耗尽抛出的异常

3、OutOfMemoryError – 内存溢出异常

总结

今天老顾介绍了异常的相关知识,这点在我们 系统开发时是非常重要 的,尤其在我们设计系统时,要 定义我们系统自己的异常 ,这个需要整体规划 异常类型、异常Code、异常信息 等,能够起到 很好的排查问题,并方便捕获处理

小疑惑

在捕获异常时, 用到try-catch ,会经常用到 finally关键字, 小伙伴应该都知道这个是 保证代码一定会被执行,如:关闭JDBC链接、保证锁unlock等。 那小伙伴们猜猜下面两段代码执行结果是什么?

代码一:

Java的异常体系,我们来全面描述一下,让你面试不愁

代码二:

Java的异常体系,我们来全面描述一下,让你面试不愁

小伙伴,可以把答案写在评论区中。谢谢!!!


-End-

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

10几年的经验实战分享

相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

推荐阅读

1、

2、

3、

4、

5、

6、

7、

8、

9、

10、

11、

12、

13、

14、

15、

16、

17、

18、

19、

20、

21、

22、

23、

24、

25、

26、

文章来源:智云一二三科技

文章标题:Java的异常体系,我们来全面描述一下,让你面试不愁

文章地址:https://www.zhihuclub.com/188783.shtml

关于作者: 智云科技

热门文章

网站地图