每一秒钟的时间都值得铭记

0%

Java自定义异常

在Java中,异常是Java的一个类,所有的异常都是以Java对象的形式存在Java程序中,异常最顶层的类是Exception,Exception和它的所有子类构成了Java的异常体系。

Java的异常体系

如果不了解Java的异常体系,可以参考我以前写的博客Java基础——运行时异常和非运行时异常

自定义异常

在Java中,JDK已经帮我们定义了很多异常,例如IOException,SQLException等等,但是这并不意味着JDK已经把所有的异常囊括其中了,对于开发环境的各种需要,很多时候,可能需要我们自定义一些异常,以帮我们完成开发。

怎么自定义异常?

刚刚已经说过了,Exception类和它的子类构成了Java语言的异常体系。所以,如果我们想要自定义一个异常,那么就直接继承Exception类或者它的子类就可以了,凡是由Exception类和它的子类派生出来的类,都是一个异常类。

自定义异常的区别

在Java的异常体系中,分为运行时异常和非运行时异常,所以我们自定义的异常也被区分在这两种异常类别中。

  • 其中凡是继承自RuntimeException的异常,都是运行时异常。
1
2
3
public class MyException extends RuntimeException {
//运行时异常
}
  • 继承Exception或者Exception的子类(非RuntimeException异常)的异常都是非运行时异常。
1
2
3
public class MyException extends Exception {
//非运行时异常
}

自定义的异常同样符合Java异常体系的所有特点,运行时异常我们可以不需要捕获,非运行时异常需要我们手动抛出或者捕获异常。

枚举

在自定义异常中,我们为了便于管理和实例化自定义异常类,一般会将异常信息定义在枚举类。

什么是枚举?

1
2
public enum  ExceptionEnum {
}

枚举类使用enum作为关键字,声明这是一个枚举类。

枚举类其实就是一个普通的Java类,但是这个类默认继承了java.lang.Enum类,所以比起Java中的普通类,有了一些其他的特征,这就是枚举类的特征。

  • 非抽象的枚举类,默认使用final修饰,所以枚举类不能派生子类。
  • 枚举类只能定义一个public修饰的类,而且类名必须与文件名相同(和普通的Java类规则相同)。
  • 枚举类的构造器默认是private,所以外部无法创建枚举类的实例对象,只能由枚举类自身创建。
  • 枚举类的实例对象必须在枚举类的第一行显示标识出来,这些实例对象默认是public static final修饰的属性。
  • 枚举对象默认提供了一个values()方法,用于遍历该枚举类的所有实例对象,返回值是一个枚举类数组。

使用枚举定义异常信息

1
2
3
4
5
6
7
8
9
10
11
@AllArgsConstructor
public enum ExceptionEnum {
/**
* 代码错误异常
*/
CODE_ERROR(500,"代码错误"),
REQUEST_ERROR(400,"请求错误"),
;
private Integer statusCode;
private String message;
}

自定义异常实战

自定义运行时异常

1
2
3
4
5
6
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyException extends RuntimeException {
private ExceptionEnum exceptionEnum;
}

功能测试

1
2
3
4
@Test
public void test() {
throw new MyException(ExceptionEnum.CODE_ERROR);
}

结果
在这里插入图片描述

自定义非运行时异常

1
2
3
4
5
6
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyException extends Exception {
private ExceptionEnum exceptionEnum;
}

功能测试

1
2
3
4
@Test
public void test() throws MyException {
throw new MyException(ExceptionEnum.REQUEST_ERROR);
}

结果
在这里插入图片描述

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------这是我的底线^_^-------------