1、首先来看一下JAVA异常继承关系:
关于Error和Exception的区别:
Error:
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.
错误是Throwable的子类,它表示合理的应用程序无法捕获的严重问题。
Exception:
The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch.
Exception类及其子类是Throwable的一种形式,它指示合理的应用程序可以捕获处理。
关于checked Exception和unchecked Exception区别:
check exception:程序编译期就要求要被处理的 否则编译无法通过 其定义范围为该异常是Exception的子类但不是RuntimeException的子类 则该异常为check exception
uncheckedException:该异常是RuntimeException或者是其子类
关于 error和unchecked exception的不同
这两种异常的发生时机都是runtime运行时 但是error是不建议去处理的 也就是使用try-catch 因为即便加了 大部分情况也处理不了 而runtimeException是可处理的
以下内容复制自https://blog.csdn.net/weixin_43681425/article/details/84147396#1.1
以便后续查询
2、异常处理:
有一些方法在声明的时候就声明扔出一个exception。如果这个exception是checked exception,则调用这个方法的时候就必须handle它。
checked exception就像一个炸弹,如果说方法A的某处扔出一个炸弹,或者从别处接到一个炸弹(调用了另一个扔出exception的方法), 有两种解决方案:
自己把它拆了( try-catch-finally)。 这样的话调用方法A的方法不用担心这个炸弹(异常)了
继续丢出去, 谁调用方法A谁来处理(在A的method declaration的时候加上throws.)
如果采用第一种方案,当方法B调用方法A的时候,方法A已经把炸弹拆了,方法B不用担心任何事情。
如果采用第二种方法,方法B调用方法A的时候知道同时要接到一个炸弹,于是它有两种解决方案,拆了,或者继续throws。
2.1 如何拆炸弹 用try-catch-finally
try-catch:
一个常见的数组越界exception。是个unchecked的exception,因为编译时没有要求handle,所以是个常见的新手 runtime异常。(不要求被handle,但是如果想handle也是可以的。)
一个try可以跟着好几个catch, 为了分开处理不同的错误:
一个exception发生之后,如果是Exception1类型的,就会被第一个handle,如果不是Exception1类型的就会接着往下找catch,如果是Exception2类型的,就会被第二个catch块handle。
如果Exception1和Exception2是父子关系,则儿子要先被检测,因为如果爸爸先被检测,就永远也到不了儿子那个catch块了。
finally block:
finally block 是无论如何也会发生的一个block。 catch里的代码如果不发生异常就不会被执行,但是finally里面的代码无论如何都会执行。(除非是在try或者catch里面用System.exit(1)结束jvm。)通常用来关闭文件。
另外, try-finally也是合法的。
2.2 如何继续甩锅 throws exception
用throws关键词
来看个综合的例子:
下面代码由于接到了exception没有正确handle而产生编译错误:
因为FileReader的constructor throws了一个异常
所以当getFile方法调用FileReader的时候必须handle这个异常。
下面是一个例子用上面两种方法处理异常:
运行结果:
一般来讲,所有的exception到了main方法这里都应该已经被解决了。如果,main方法也不负责任的往外扔。。。
这样做是可以的。。。在没有文件的情况下(触发exception)运行结果:
3、SpringBoot异常处理实例
3.1 定义一个全局异常处理类GlobalException 通过@ControllerAdvice和@ExceptionHandler(value = “异常类型”)
3.2定义一个异常类
3.3通过自定义的类动态获取状态码
3.4 也可以将状态码定义在配置文件中 获取办法为通过定义一个配置类动态获取