一、自定义异常类与throw
1、什么是自定义异常类?什么时候需要自定义异常类?
public class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (1<=age && age<=150) {
this.age = age;
}else {
System.out.println("age范围1~150!");
}
}
}
public class Test {
public static void main(String[] args) {
Student stu = new Student();
stu.setAge(1000);
System.out.println(stu.getAge());
}
}
上述代码定义一个学生类,类属性有age,因为年龄大小一般为0~150,所以在setAge方法中加判断语句给以警示。在执行Test中的main方法时显然会得到:
但是这种输出仅仅是输出一句话,无法像抛出异常那样能准确定位到代码出错的位置!有一种更加便利的方法来提醒程序员,就是自定义异常类。
//1、定义一个类,继承异常类以后,若继承或间接继承的是RuntimeException则为运行时异常,否则为检查时异常
public class AgeException extends RuntimeException {
//2、定义构造方法,调用父类有参构造方法,显示信息
public AgeException(String message) {
super(message);
}
}
上述代码定义了一个异常类,该异常类继承与RuntimeException,它也为运行时异常,不用显式处理。我们将Student类中的setAge方法改为:
public void setAge(int age){
if (1<=age && age<=150) {
this.age = age;
}else {
throw new AgeException("age范围1~150!");
}
}
运行结果:
一目了然,不仅能看到提示信息,而且根据异常名能知道什么出了异常,以及该去哪找。
也可以得到throw抛出的是对象,且用在方法体内或是代码块中使用。
throw抛出的异常处理方法:
- 直接使用try-catch包裹throw语句
- throw所在方法体没有处理,抛给创建该异常的异常类
public void setAge(int age) throws AgeException{
}
当然如果该异常属于运行时异常也可不用处理。
- 使用try-catch包裹含有throw语句的方法。
二、throws
throws一般用于抛出检查时异常,throws抛出的是类,如果有多个类在类之间加逗号隔开,throws只在参数列表后使用。
有如下代码:
public class Test{
public static void show(int age) throws PrinterException{
if(age<0||age>150){
try {
throw new PrinterException(“操作失败:年龄取值范围为0~150”);
} catch (PrinterException e) {
System.out.println("show方法");
e.printStackTrace();
}
return;
}
System.out.println(age);
}
public static void main(String[] args) {
try {
show(1000);
} catch (PrinterException e) {
System.out.println("main方法");
e.printStackTrace();
}
}
}
运行结果入下:因为throw new PrinterException(“操作失败:年龄取值范围为0~150”);此处异常已经使用try-catch处理,所以定义show方法的参数列表后的throws PrinterException没有起作用,也就是在main方法中show(1000);没有出现异常,main方法中的catch没有执行,符合上述执行结果。