大家好,欢迎来到IT知识分享网。
欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
前言
小伙伴们对Java的异常应该是不陌生的,不过很多人只是简单的应用而已,而没有全面的,整体的去了解Java的异常体系。今天老顾就来跟大家一起学习JAVA的异常。
3W原则
哪都有的3W原则,JAVA异常也可以总结3W:what、where、why
what对应异常类型:回答了什么被抛出
where对应异常堆栈跟踪:回答了在哪抛出
why对应异常信息:回答了为什么被抛出
异常体系
上图我们看出Throwable是异常的顶级类,Error和Exception是他的子类。
Exception又分RuntimeException和非RuntimeException子类。
Error与Exception区别
我们看一下他们的概念定义:
Error:程序无法处理的系统错误,编译器不做检查。
Error表示系统致命的错误,程序没法处理。一般是与JVM相关的问题,如系统崩溃,内存溢出,方法调用栈溢出等,如:经常遇到的StackOverflowError、OutOfMemoryError。这种类型的错误,编译器不做检查,都是系统运行过程中发生的。
这些错误靠我们程序本身是无法处理与预防的,遇到了建议直接程序中止、重启。
Exception:程序可以处理的异常,捕获后可处理。
Exception异常是程序能够捕获的,也可以做异常处理,我们要尽可能的去处理,使程序继续运行,而不是中止程序。
总结一下就是Error是程序无法处理的错误,Exception是可以处理的异常。
RuntimeException与否区别
上图中Exception有两种类型的异常,我们来看一下
RuntimeException:不可预知的,程序应当自行避免
何为不可预知?如:数组下标越界,访问对象空指针等,这种异常是我们小伙伴们在编写程序时要尽量避免。也就是我们程序员是能够避免的。
如针对空指针异常,我们应该在编程的时候,加上空指针判断,if(obj == null)如何如何,这样就避免了空指针异常。
非RuntimeException:可预知的,编译器可检查的异常
可预知,如:在我们打开一个文件时,如文件不存在引用的异常。
这种异常编译器会检查出来,必须需要处理的。
这个也称之为Checked Exception异常类型
责任归属
我们从责任角度看:
1、Error属于JVM需要承担的责任
2、RuntimeException是程序应该承担的责任
3、非RuntimeException(CheckedException)可检查异常是JAVA编译器应该承担的责任
上面代码直观一点:
们看到Error和RuntimeException编译器是不检查的,而CheckedExcepton异常编译器是检查的,也就是我们程序员是必须要捕获处理的。那怎么处理呢?
1、try-catch方式
用try-catch方式捕获这个异常,可以在catch代码段进行异常逻辑处理,这个就按照实际业务而定。如上图代码是FileNotFound异常,根据这个类型我们就知道是文件句柄不存在,那我们应该做哪些处理。如:提示一下用户该文件不存在
2、上抛异常方式
在复杂的业务中,我们的程序员自己写的模块,很有可能被其他程序员写的模块进行引用,为了能够让其他程序员知道我们模块的异常,并要他们要进行处理,我们就可以采用上抛异常方式
我们看一下上层调用的处理
我们看到上抛异常,是需要调用方进行处理的。那处理的方式是什么呢?其实就是上面讲的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等。那小伙伴们猜猜下面两段代码执行结果是什么?
代码一:
代码二:
小伙伴,可以把答案写在评论区中。谢谢!!!
-End-
如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!
10几年的经验实战分享
相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上
欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
推荐阅读
1、秒杀系统的核心点都在这里,快来取
2、你了解如何利用token方式实现分布式Session吗?
3、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂
4、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调
5、企业实战Redis全方面思考,你思考了吗?
6、面试题:Thread的start和run的区别
7、面试题:什么是CAS?CAS的作用以及缺点
8、如何访问redis中的海量数据?避免事故产生
9、如何解决Redis热点问题?以及如何发现热点?
10、如何设计API接口,实现统一格式返回?
11、你真的知道在生产环境下如何部署tomcat吗?
12、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案
13、分享大厂分布式唯一ID设计方案,快来围观
14、你想了解一线大厂的分布式唯一ID生成方案吗?
15、你知道如何处理大数据量吗?(数据拆分篇)
16、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)
17、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?
18、你了解大型网站的页面静态化吗?
19、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?
20、你知道怎么解决DB读写分离,导致数据不一致问题吗?
21、DB读写分离情况下,如何解决缓存和数据库不一致性问题?
22、你真的知道怎么使用缓存吗?
23、如何利用锁,防止缓存击穿?重构思想的重要性
24、海量订单产生的业务高峰期,如何避免消息的重复消费?
25、你知道如何保障生产端100%消息投递成功吗?
26、微服务下的分布式session该如何管理?
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13441.html