前两次博文介绍了异常的基本概况以及处理异常的方式,这一篇博文介绍自定义异常。
一,自定义异常的定义
通过阅读异常源代码:发现java中所有的异常类,都是继承Throwable,或者继承Throwable的子类。这样该异常才可以被throw抛出。
说明这个异常体系具备一个特有的特性:可抛性:即可以被throw关键字操作。
并且查阅异常子类源码,发现每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮我们进行异常信息的封装。
例如NullPointerException异常类源代码:
public class NullPointerException extends RuntimeException {
public NullPointerException() {
super();//调用父类构造方法
}
public NullPointerException(String s) {
super(s);//调用父类具有异常信息的构造方法
}
}
照葫芦画瓢,我们可以自己定义一个类似的异常,语法如下:
Class 异常名 extends Exception{ //或继承RuntimeException
public 异常名(){
}
public 异常名(String s){
super(s);
}
}
二,自定义异常的一个例子
定义Person类,包含age成员变量。
在Person类的有参数构造方法中,进行年龄范围的判断,若年龄为负数,则抛出AgeException异常,异常提示信息“年龄不能为负值”。
自定义异常类
/*
* 如果自定义异常继承 RuntimeException 说明该异常为运行时异常
* 如果自定义异常继承Exception 说明该异常是编译时异常
*/
public class AgeException extends RuntimeException{
public AgeException(){
}
public AgeException(String str){
super(str);//交给父类处理,最终给的给Throwable
}
}
Person类
public class Person {
private int age;
public Person(int age) {
super();
if(age<0){
//抛出一个自定义异常对象
//使用自定义异常为了见名知义:例如看到我们自定义异常AgeException
//就知道问题的产生跟年龄有关
throw new AgeException("年龄不能为负值");
}
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<0){
//抛出一个自定义异常对象
throw new AgeException();
}
this.age = age;
}
}
测试类
public class Demo13 {
public static void main(String[] args) {
Person p=new Person(-1);
p.setAge(-3);
System.out.println(p.getAge());
}
}