学习目标:
java中的异常和错误
学习内容:
- 首页要了解什么是异常什么是错误
- 捕捉全局异常
- 自定义异常
一、java中异常和错误的区别
Error类和Exception类的父类都是throwable类: 他们的区别是:
- Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
- Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
常见的异常 :
ArrayIndexOutOfBoundsException 数组下标越界异常,
ArithmaticException 算数异常 如除数为零
NullPointerException 空指针异常
IllegalArgumentException 不合法参数异常
直接上代码
public class exception {
public static void main(String[] args) {
exception01();
}
public static void exception01(){
int i =1/0;
}
}
结果是:算数异常,如果直接让用户看见异常信息不友好
改造一下写法:把异常捕获,这样就不会看见异常信息,这里写的有些问题 不应该写Execption,这个异常都所有异常的父类,应该写对应的异常,算数异常是 arithmeticExecption
真正的项目里发生异常该怎么捕获呢?下面就来了解一下全局异常,创建springboot项目
1.创建一个controller包,里面写了一个异常方法,
2.配置swagger-ui来进行接口的访问
@GetMapping("exception")
public R exception(){
throw new RuntimeException("运行异常");
}
结果肯定是报错,但是这个异常是可以人工干预的,避免控制台输出报错信息,或者把报错解释的详细一点
创建一个MyExceptionHandler类,这个类就是来帮我们捕获全局异常的类,
1.在这个类上加上@RestControllerAdvice注解
2.创建一个方法
3.在方法上加上@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法 专门处理该类异常,比如这样:,
@RestControllerAdvice
@Slf4j
public class MyExceptionHandler {
@ExceptionHandler(value = Exception.class)
public String exceptionHandler(Exception e){
log.error("未知异常!原因是:"+e.getMessage());
return "未知错误!!!";
}
}
继续访问异常的接口,没有报错了,返回的结果也我定义的数据
控制台也输出异常信息
到这异常的捕获就完成了,但是我们捕获都是系统自带的异常,我就在想能不能自定义异常,然后进行捕获,开干
实现步骤:
- 创建一个枚举进行异常传递
- 创建一个自定义的异常类取名叫CustomException,
- 在MyExceptionHandler全局异常中把自定义异常捕获
枚举
@Getter
@AllArgsConstructor
public enum RCode {
SUCCESS(0,"操作成功!"),
fail(1,"操作失败!"),
AUTH_ERROR(40411,"用户名或密码不存在!"),
NO_AUTH_ERROR(40412,"无权访问!"),
SYS_VALID_ERROR(501,"参数校验错误"),
SYS_EXCEPTION(2,"模拟异常"),
INVALID_TOKEN(40410,"Token无效,您无权访问该接口"),
;
private Integer code;
private String msg;
}
CustomException类
@Getter
public class CustomException extends RuntimeException{
private RCode rCode;
public CustomException(RCode rCode) {
this.rCode = rCode;
}
public CustomException(Throwable cause, RCode rCode) {
super(cause);
this.rCode = rCode;
}
}
在全局异常类中捕获
@RestControllerAdvice
@Slf4j
public class MyExceptionHandler {
//捕获自定义异常
@ExceptionHandler(value = CustomException.class)
public R CustomerExceptionHandler(CustomException e){
log.error("未知异常!原因是:"+e.getRCode().getMsg());
return R.error(e.getRCode());
}
}
进行测试:首页修改controller中接口抛出的异常 换成我们自己定义的异常类
进行测试:结果
控制台:
总结:以上就是我个人对全局异常的理解以及实现,因为本人也在学习的过程中慢慢探索的,肯定有很多地方不完美有问题或者解释的不清楚希望多理解也帮忙指出问题所在,