throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常。
throws是方法可能抛出异常的声明
throw关键字
首先创建一个Person类
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然后在主方法中new一个Person对象
Person p = new Person();
给p的年龄赋值
p.setAge(10);
这样输出年龄是没有问题的
但是如果有用户给年龄赋值为1000——如果没有异常处理机制时,这样赋值也是没有问题的,但是在现实生活中,没有人的年龄可以是1000岁,这时候就需要我们在Person类中的setAge()方法中设置异常处理机制
public void setAge(int age) {
if(age<0 || age>100){
throw new RuntimeException("年龄不合法");
}
this.age = age;
}
这时在主方法中给p的年龄赋值为1000时,就会报错。
因为主方法不知道setAge()方法中报了这个异常,导致虚拟机不能把这个程序执行到底。所以我们需要在setAge()方法里向上层报这个异常,这时就需要用到***throws***关键字
throws
作用:向调用它的上层说明,调用此方法可能会报错。
public void setAge(int age) throws Exception {
//通知上层这个方法会报错,用throws关键字
if(age<0 || age>100){
throw new Exception("年龄不合法");
//除了RuntimeException可以不通知上层,其他异常都需要写上throws
//抛什么异常就throws什么异常
}
this.age = age;
}
这时在上层调用setAge()方法时便会报错,要求我们主动去处理这个异常:
改成:
try {
p.setAge(1000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//语法上没有问题,但是业务逻辑上是不合理的
现在,主方法调用setAge()方法时处理了它可能报的错误,当程序运行时,尽管还是会报错,但是虚拟机可以把这个程序完整地执行到底。