throw
throw用于抛出具体异常类的对象,一般用于方法体中。
什么时候使用:当所写代码不满足某些条件致使程序无法运行时可以借助throw抛出一个异常对象提醒程序员。
public class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<150 && age>1) {
this.age = age;
}else {
throw new AgeException("age的范围是1——150");
//这里为什么不用输出语句呢?
//因为输出语句仅仅只是输出一句话,无法像抛出异常一样准确定位到代码出错的位置
}
}
}
throw关键字一般用在方法体中,也可以用在代码块中,但如果代码块中抛出的异常对象是由检查时异常创建的,则必须用try-catch进行处理,或者使用throws继续上抛
public class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age<150 && age>1) {
this.age = age;
}else {
try {
throw new Exception("age的范围是1——150");//Exception换为RuntimeException则为运行时异常
//如果这里抛出的是一个检查时异常,则必须用try-catch处理或者用throws上抛
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
throw关键字可以将异常抛给自己(即抛出之后就用try-catch捕获)、也可以抛给方法调用者(即只是抛出,不做任何处理,如果抛出的异常对象是检查时异常类创建的,则还需要使用throws抛出创建该异常对象的异常类或者其父类),调用者有两种处理方式:1、方法调用者使用try-catch处理该异常(推荐方法) 2、方法调用者继续上抛该异常
使用throw抛出异常对象如果没有try-catch捕获该异常对象,则该抛出异常对象语句执行后其所在方法结束执行。
throws
throws用于声明方法可能抛出的异常,其后面跟的是异常类,可以有多个(用逗号" , "间隔)
什么时候使用:
- 当方法体中的throw关键字抛出异常对象由检查时异常创建时,如果该异常对象在抛出的同时已经用try-catch处理,则可以不适用throws,否则必须使用throws抛出创建该对象的异常类或者其父类。
- 所调用方法抛出了检查时异常时,如果该方法在调用的同时已经通过try-catch处理,则不需要使用throws继续上抛该异常,否则必须使用throws继续上抛该异常,此时上抛的异常类可以是调用方法时方法抛出的异常类也可以是其父类。
注意: - 如果方法中的异常已经用try-catch捕获了,则无需再用throws上抛该异常,否则上抛无效。
- 如果方法中的代码或者方法中所调用的代码没有使用throw抛出异常类对象,则无需使用throws,否则throws抛出的异常类无效;即使用throws方法中的代码一定存在使用throw抛出异常对象的代码。
public class Test{
public static void show(int age) throws RuntimeException{//使用throws继续上抛
if(age<0 || age>150){
throw new RuntimeException("年龄范围是0-150");//这里throw抛出了一个运行时异常,没有使用try-catch处理,则需要使用throws继续上抛,如果这里被捕获了,则本方法参数列表后不用继续上抛
}
}
public static void main(String[] args){
try{
new Test.show(1000);
//这里选择了使用try-catch语句,这里还可以接着上抛。
//如果这里不进行任何操作的话,制台会报出异常,而且程序执行到这里不会继续执行,即不会输出OK;继续上抛之后也不会执行下面代码(多次上抛,每次上抛的异常类的范围需要是本类或者其父类)
}catch(RuntimeException e){
e.printStackTrace();
}
System.out.println("OK");
}
}
throw与throws的区别
- 抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是异常类
- 抛出的位置不同:throw可以在代码块(如果在代码块中抛出的是检查时异常类创建的对象,则必须使用trycatch自行处理)和方法体中使用,而throws只能用在方法声明的括号后面。