说明:
(1) 本篇博客的目的:【 在【SpringBoot电商项目用户模块注册接口开发】开发注册接口时,遇到了【自定义异常】、【使用GlobalExceptionHandler去全局处理异常】】→【在上面的过程中,发现,进一步了解下Java的异常体系,梳理清楚Java异常的划分、脉络,是比较重要的】→【所以,本篇博客就来梳理一下】;
(2)声明: 本篇博客并没有什么新内容;只是进一步的梳理,稍微看下就行;
声明:有关Java异常的内容,如有需要可以参考【Java异常】及后续的十几篇文章;
目录
一:Java异常体系;
二:自己对异常的一点总结;(这儿的总结,不太严谨,以后有精力了,再好好调整一下)
1:什么是异常;
2:异常怎么处理;
一:Java异常体系;
说明:
(1) Java异常有个顶级接口:Throwable;;Throwable的意思是【可抛出的】;其又细分为了Error和Exception;
(2) Error表示这是一个严重的问题;JVM不能去处理;比如【OutOfMemoryError内存不足】,【StackOverflowError栈溢出】;当程序发生这些Error时,往往意味着程序需要人为介入,否则程序就会崩了;
(3) Exception也分为两类:
● RuntimeException:程序运行时,出现的异常;如【NullpointerException空指针异常】、【ArithmeticException数学异常】;;;对于,这种异常,我们是没有办法提前预知和处理的;;;;我们只有遇到了,才能去处理;
● 非RuntimeException的Exception:如【IOException】;;对于这种异常,我们在开发程序的时候,能够提前预知到“可能会发生”;所以,我们就可以使用try catch去应对可能发生的异常;;;;;而且,对于这种异常,程序也会要求我们对其进行处理;(处理,包括两种办法:try-catch了,throw抛出去)
(4) 清楚Java异常体系是比较重要的;;;;以后,在遇到异常,去处理的时候,也更得心应手;
● 比如遇到Error错误时,一般通过代码不一定能够很好的解决;;;比如【OutOfMemoryError内存不足】,要么去加内存,要么就是优化程序的整体架构,或者是清除程序中的【导致内存被滥用的,严重bug】;
● Exception;
二:自己对异常的一点总结;(这儿的总结,不太严谨,以后有精力了,再好好调整一下)
声明:这儿仅为个人理解,可能存在不准确、甚至错误的情况;(尤其是还没看过JVM;所以,这儿的理解很肤浅)
1:什么是异常;
异常:可以看成是程序中的【错误】;
异常总体上可以分为两类:【系统异常】和【自定义异常】;
系统异常:可以看成是Java本身定义的那些异常,比如【RuntimeException】、【IOException】;
自定义异常:大多数与业务逻辑有关;比如,用户注册的时候,用户会填写用户名和密码,但是调用后台的时候,发现这个用户已经被占用了;这也是一种【错误】;而对于这种逻辑上的错误,我们一般通过【自定义异常】来表征;
2:异常怎么处理;
而,对于程序中出现的【错误】(也就是异常啦)我们是需要去妥善处理的;
而面对异常的态度总体上分为两种:
● A处出现的异常,A处直接就处理了;
● A处出现的异常,A处不处理,而是把异常向上抛;(谁调用A,谁就接这个锅)
对于处理异常,总体上有两类情况:
● 通过try-catch把异常给捕获了,以确保不耽误程序的后续执行;(这儿有点这种感觉:程序中出现了异常,那么我们就迅速的私下把它给处理了,迅速的息事宁人,防止事态扩大,方式异常对外造成影响)
● 但是,对于有些异常,尤其是【自定义异常】,我们往往不能把这个异常给私下处理了;因为,这个异常对应的情况,要反映上去;比如下面描述的案例:【还以“用户注册”为例】→【用户在前端,填写用户名和密码,调用后台逻辑,去注册了】→【但是,后台在处理的时候,发现这个用户名已经被占用了】→【于是,后台就会出现一个“用户名已经被占用的,自定义异常”】→【那么,对于这个异常,我们不能把它扼杀在摇篮中,而是要把这个异常给一层一层的反应上去,直到反映给前端】→【即,比如这个异常是在Service发现的】→【那么,Service层需要把这个异常向上抛,Controller层调用Service层的时候,会获取到这个异常】→【Controller层会把这个异常抛给前端】→【自然,我们这儿需要额外处理一下,提取这个异常的信息,包装成合适的返回对象,返回给前端】→【前端,收到这个返回信息,就能知道用户名重名了】;