先来谈谈什么是异常,以及java中对于异常的处理,还有java中异常的基本结构。
1、什么是异常,java如何处理它?
顾名思义,在java中通常会产生很对我们可以预知和不可以预知的错误。这些错误我们称之为异常Exception。当然这个名字本身包含了java 对于异常的定义和处理思路。
这源于java 的基本概念“结构不佳,不能运行”,发现这些错误的最佳时机当然是编译期也就是程序运行前。但是有些情况是完全无法预知的。运行期处理error,就要求程序应该具备将error通过某种方式把适当的信息传递给某个接收者。另外配合上面向对象的思想。Exception便应运而生。所以在java中异常这个对象就是用来传递error info 的,以便我们快速定位问题。
当我们抛出异常后,有几件事情随之发生。首先,同java程序中的其他对象一样,将使用new在堆上创建异常对象。然后,当前的执行路径被终止,并且从档期那环境弹出异常对象的引用。此时异常处理机制接管程序,并开始寻找下一个恰当的地方来继续执行程序。(这个恰当的地方就是异常处理程序)。就是我们熟知的try catch代码块。
2、java Exception 的基本结构
如下便是异常的结构图,我们可以看到java中有两大类异常。而与异常并列的是Error,
error是指在正常情况下,不大可能出现的情况,绝大部分的error都会导致程序(比如jvm自身)处于非正常的、不可恢复的状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类
2.1、 checked exception 即 io异常和sql异常:
对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。
2.2 、runtime exception 即 运行异常
运行异常我们可以不处理。当出现这样的异常时,总是由虚拟机接管。
3、实际项目中代码会根据业务千变万化,所以Exception 需要根据情况定制。结合第一节对exception的理解,实际项目中的异常通常采用如下处理方式。
3.1、定义interface,以便扩展。
3.2、定义具体的类实现interface
3.3、自定义异常类,根据具体业务继承具体的异常。
3.4、封装异常捕获类
3.5、具体如何捕获异常
@ControllerAdvice:控制器增强注解
@ExceptionHandler(CustomException.class):异常捕获注解,该注解会将拦截指定的异常类信息,然后处理
@ResponseBody:将捕获到的异常信息进行返回,主要是结合springmvc返回json字符串使用
3.6、定义response