在Java中,异常是Java的一个类,所有的异常都是以Java对象的形式存在Java程序中,异常最顶层的类是Exception,Exception和它的所有子类构成了Java的异常体系。
Java的异常体系
如果不了解Java的异常体系,可以参考我以前写的博客Java基础——运行时异常和非运行时异常。
自定义异常
在Java中,JDK已经帮我们定义了很多异常,例如IOException,SQLException等等,但是这并不意味着JDK已经把所有的异常囊括其中了,对于开发环境的各种需要,很多时候,可能需要我们自定义一些异常,以帮我们完成开发。
怎么自定义异常?
刚刚已经说过了,Exception类和它的子类构成了Java语言的异常体系。所以,如果我们想要自定义一个异常,那么就直接继承Exception类或者它的子类就可以了,凡是由Exception类和它的子类派生出来的类,都是一个异常类。
自定义异常的区别
在Java的异常体系中,分为运行时异常和非运行时异常,所以我们自定义的异常也被区分在这两种异常类别中。
- 其中凡是继承自RuntimeException的异常,都是运行时异常。
1 | public class MyException extends RuntimeException { |
- 继承Exception或者Exception的子类(非RuntimeException异常)的异常都是非运行时异常。
1 | public class MyException extends Exception { |
自定义的异常同样符合Java异常体系的所有特点,运行时异常我们可以不需要捕获,非运行时异常需要我们手动抛出或者捕获异常。
枚举
在自定义异常中,我们为了便于管理和实例化自定义异常类,一般会将异常信息定义在枚举类。
什么是枚举?
1 | public enum ExceptionEnum { |
枚举类使用enum
作为关键字,声明这是一个枚举类。
枚举类其实就是一个普通的Java类,但是这个类默认继承了java.lang.Enum
类,所以比起Java中的普通类,有了一些其他的特征,这就是枚举类的特征。
- 非抽象的枚举类,默认使用
final
修饰,所以枚举类不能派生子类。 - 枚举类只能定义一个
public
修饰的类,而且类名必须与文件名相同(和普通的Java类规则相同)。 - 枚举类的构造器默认是
private
,所以外部无法创建枚举类的实例对象,只能由枚举类自身创建。 - 枚举类的实例对象必须在枚举类的第一行显示标识出来,这些实例对象默认是
public static final
修饰的属性。 - 枚举对象默认提供了一个
values()
方法,用于遍历该枚举类的所有实例对象,返回值是一个枚举类数组。
使用枚举定义异常信息
1 |
|
自定义异常实战
自定义运行时异常
1 |
|
功能测试
1 |
|
结果
自定义非运行时异常
1 |
|
功能测试
1 |
|
结果