异常的三种类型
检查性异常
最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常
运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误
错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
常见的异常处理方法
抛出异常
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
异常捕获
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方进行异常捕获,并不会影响后续代码的执行。
自定义异常类
自定义一个异常类,继承RuntimeException
public class BizException extends RuntimeException {
private Integer code;
private Object data;
public <T> BizException(ExceptionMessageEnum exceptionMessageEnum, T data) {
super(LANGUAGE_EN.equals(LocaleContextHolder.getLocale().getLanguage())
? exceptionMessageEnum.name() : exceptionMessageEnum.message);
this.code = exceptionMessageEnum.code;
this.data = data;
}
public BizException(ExceptionMessageEnum exceptionMessageEnum) {
super(LANGUAGE_EN.equals(LocaleContextHolder.getLocale().getLanguage())
? exceptionMessageEnum.name() : exceptionMessageEnum.message);
this.code = exceptionMessageEnum.code;
}
public BizException(String message) {
super(message);
}
public Integer getCode() {
return code;
}
public Object getData() {
return data;
}
}
定义一个枚举类,记录异常结果
public enum ExceptionMessageEnum {
ERROR(6000, "系统异常"),
ID_IS_NULL(6001, "ID IS NULL")
;
public Integer code;
public String message;
ExceptionMessageEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}
自定义异常使用
public class Test{
public void checkId(TargetRequest targetRequest) {
if (targetRequest.getId() == null) {
throw new BizException(ID_IS_NULL);
}
}
}