说明:

(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层会把这个异常抛给前端】→【自然,我们这儿需要额外处理一下,提取这个异常的信息,包装成合适的返回对象,返回给前端】→【前端,收到这个返回信息,就能知道用户名重名了】;