throw 与 throws
这两个关键字同样都是用在异常处理这一块的 , 虽然看似一样,但实际这两个区别不小
先看定义 :
throw : 用于显式抛出异常,抛出的时候是抛出的是一个异常类的实例化对象.
throws : 定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处理。
先解释 throws , 也就是说 , 如果我们一个方法里可能会存在异常 , 我们在这个方法里并不处理, 而是告知 调用这个方法的地方去处理 ,如果是另一个方法去调用这个方法,那么这另一个方法也可以去选择 throws 这个异常 ,也就是继续交给 调用它的上一级去处理 ,也就像踢皮球一样 ,不想处理就丢给它的上一级 ,但最终是要有地方去处理这个异常的,它存在于方法声明处
例 :
public void method1() throws UnsupportedEncodingException {
"s".getBytes("utf-8");
}
public void method2() throws UnsupportedEncodingException {
method1();
}
public void method3(){
try {
method2();
}catch (Exception e){
e.printStackTrace();
}
}
方法1 里面的这段代码是存在编译期异常的 ,但我们没有去处理它, 而是将它抛给了上一级,也就是方法 2 , 但是方法2也没有去处理 ,而是直接抛给了方法 3 ,在方法3中 它是直接用try catch 组合去捕获处理了这个异常
需要注意的几点是 : ● 任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
●
子类重写父类中的方法,子类方法不能声明抛出比父类类型更大的异常(针对编译期异常)。
子类在重写父类方法时,它所抛出的异常类型只能比父类小或者相等,另外,在我们上述的例子中,如果把方法1 中 throws 抛出的改成Exception 的话 ,那么在method2()中它也只能够去抛出 Exception , 同样的这里我们在往上一级一级抛出的时候 ,类型也是慢慢变大的 ,上一级的范围不能比下一级小,这里method2就可以去抛出 Exception ,而 method1 这样抛出是会报错的
接着来谈 throw
throw 用于方法体 , 直接抛出一个异常对象
例 :
public static void method(int x){
if (x == 0){
throw new IllegalArgumentException("分母不能为0");
}
int i = 10/x;
}
•
在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
这里的意思是,我们可以自己手动抛出这个对象来被 try 捕获 ,我们一般使用throw 后,
要么使用try catch捕获异常,要么使用throws声明异常
因为这里我们仅仅是抛出了异常对象,并没有去处理它