异常处理

1、首先来看一下JAVA异常继承关系:


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 也可以将状态码定义在配置文件中 获取办法为通过定义一个配置类动态获取

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。