自定义异常类分三步:
- 自定义枚举类
- 自定义异常类
- 测试
自定义枚举类:
为什么要自定义枚举类?
因为在自定义异常时,常常是自己在写 异常信息说明
,这可能会导致这样的情况发生:同一个场景问题,可能会出现多个不同的描述。如,前台传参错误,可能会描述为:参数错误、name 参数没传…等。所以,为了 统一异常信息说明
,就用到了枚举类。
所以正常情况下,异常类的代码如下:
public class MyException extends RuntimeException {
private Integer code;
private String msg;
// 扩展的构造方法
public MyException(CodeStatusEnum codeStatusEnum) {
super(codeStatusEnum.getMsg());
this.code = codeStatusEnum.getCode();
this.msg = codeStatusEnum.getMsg();
}
//getter/setter
}
但考虑到这样的情况发生,一个系统中可能用到了很多个枚举类、那上面的入参构造方法就无法满足了。
所以,这里的解决方案是:将枚举类向上抽象出一个接口,然后,枚举类去实现它。
自定义接口:
public interface IErrorCode {
// 获取状态码
int getCode();
// 获取异常信息
String getMsg();
}
自定义枚举类:
public enum CodeStatusEnum implements IErrorCode{
EMPTY_PARAM(1001, "参数为空")
,
ERROR_PARAM(1002, "参数错误")
,
EMPTY_OBJECT(1003, "对象为空")
;
private Integer code;
private String msg;
CodeStatusEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
// 实现了接口中的方法
@Override
public int getCode() {
return code;
}
// 实现了接口中的方法
@Override
public String getMsg() {
return msg;
}
}
其中,枚举类里面的枚举实例由实际情况而定哈。需要新的枚举状态可以直接添加
自定义异常类:
理解 Error、RuntimeException(运行时,虚拟机报的错)和非 RuntimeException(编译时,编译器找出的错)
- Java中异常均继承自 Throwable 类,它有两个重要的直接子类:Error、Exception;
- Java错误 Error,大部分是由虚拟机爆出来的错误,是程序无法处理的错误。如:OutOfMemoryError,当 JVM 需要更多内存空间而得不到满足时,就会爆出 OutOfMemoryError;
- Exception 异常,分为运行时异常 RuntimeException、非运行时异常。RuntimeException:编译器不会帮你自动检查,当你运行程序时,虚拟机才会给你报出错误让你去处理,这个往往是我们编码逻辑或不规范导致的;非RuntimeException 是在代码书写时,编译器给你检查提示你要进行 try-catch 或 throws 处理
public class MyException extends RuntimeException {
private Integer code;
private String msg;
public MyException(Integer code, String msg) {
super(msg);
this.code = code;
this.msg = msg;
}
public MyException(IErrorCode errorCode) {
super(errorCode.getMsg());
this.code = errorCode.getCode();
this.msg = errorCode.getMsg();
}
//getter/setter
}
自定义异常时,需要做两个步骤:
- 新建一个异常类,然后继承 Exception/RuntimeException。如果在编译时就需要处理异常,那就继承 Exception。不过,一般都是继承 RuntimeException
- 给异常类添加相应的构造方法
测试
public class UserService {
public User getUser() {
// 这里通过数据库查询,将返回的值赋给 user 变量。这里为了就简,就没涉及到数据库查询了
User user = null;
// 对返参进行校验,如果为空,则抛出一个自定义异常对象
if (null == user) {
// 当对象为空时,就抛出一个异常
throw new MyException(CodeStatusEnum.EMPTY_OBJECT);
}
return user;
}
}
public class Test {
public static void main(String[] args) {
UserService userService = new UserService();
try {
// 运行时进行捕获
User user = userService.getUser();
} catch (MyException e) {
// 这里可以将异常信息进行统一封装,返回给前端
System.out.println(e.getMsg());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
这里就简单介绍下,如何自定义异常。