创建一个Person类
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
如果我们想控制输入的age的范围在(1到150)可以有两种方法
- 在setAge方法内添加if语句直接作判断
public void setAge(int age) {
if(age > 0 && age <= 150) {
this.age = age;
}
System.out.println("输入的年龄应在1-150范围内");
}
测试代码
public static void main(String[] args) {
Person person = new Person();
person.setAge(1000);
}
结果
输入的年龄应在1-150范围内
- 在setAge方法中抛出异常,查看Java的API文档并没有关于超出年龄限制的异常类。
所以这里就需要先自定义一个异常类
说明:这里自定义一个AgeException异常类有两种方法
- 直接继承Exception,这时为检查时异常,但需要显式处理。
public class AgeException extends Exception {
public AgeException(String message) {
super(message);
}
}
显示处理方法一:使用throws在方法上抛出,但是需要在调用该方法的代码中处理
public void setAge(int age) throws AgeException {
if(age> 0 && age <=150) {
this.age = age;
}
throw new AgeException("年龄范围应为1-150");
}
这里可以直接使用try…catch…处理(也可以继续在方法上使用throws抛出,让JVM处理)
public static void main(String[] args) {
Person person = new Person();
try {
person.setAge(1000);
} catch (AgeException e) {
e.printStackTrace();
}
}
或者再次使用throws抛出该异常让JVM处理(不推荐)
public static void main(String[] args) throws AgeException {
Person person = new Person();
person.setAge(1000);
}
显示处理方法二:使用try…catch…直接处理该异常
public void setAge(int age) {
if(age> 0 && age <=150) {
this.age = age;
}
try {
throw new AgeException("年龄范围应为1-150");
} catch (AgeException e) {
e.printStackTrace();
}
}
- 也可以继承RuntimeException(或者它的子类),这时为运行时异常,可以暂时不处理,也可以使用try…catch…显示或throws处理。
// 这里继承了RuntimeException
public class AgeException extends RuntimeException {
public AgeException(String message) {
super(message);
}
}
public void setAge(int age) {
if (age > 0 && age <= 150) {
this.age = age;
}
// 不会出现检查时异常,可以通过编译
// 也可以使用try......catch.....或throws处理(选择一种即可)
throw new AgeException("年龄范围应为1-150");
}
测试代码
public static void main(String[] args) {
Person person = new Person();
person.setAge(1000);
}
结果(两种方法抛出的异常相同):
xception in thread "main" com.xingtang.test3.AgeException: 年龄范围应为1-150
at com.xingtang.test3.Person.setAge(Person.java:14)
at com.xingtang.test2.Test.main(Test.java:8)
如果代码量较大使用异常自定义异常类,可以快速的查找出出现错误的代码位置,便于错位定位。
注意:try…catch…和thows使用一种即可
try…catch…:直接在该方法内把异常处理
throws:让方法的调用者处理(或者在本方法中使用try…catch…无法解决,让方法的调用者处理)
throw与throws的区别
1.throw 抛出的是异常对象,throws抛出的是类,如果需要抛出多个类需要用逗号隔开
2.throw 用于代码块和方法体中,throws只能用于方法的参数列表之后
3.如果throw抛出的是运行时异常和检查时异常的区别
如果throw抛出的是检查时异常需要显式的处理比如try…catch或throws,如果是运行时异常则不需要。
比如上面的自定义异常AgeException类,如果直接继承Exception的时候就是检查时异常,需要显式的处理才能通过编译,否则不能通过编译。而继承RuntimeException的时候可以不处理,也可以通过编译。
throw | thows |
---|---|
抛出的是异常对象 | throws抛出的是类 |
用于代码块和方法体中 | 只能用于方法的参数列表之后 |