1. 基本介绍
- 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
- 在方法声明中用
throws
语句可以声明抛出异常的列表,throws
后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
2. 快速入门案例
解读:
1. 这里的异常是一个 FileNotFoundException,编译异常
2. 使用 try-catch-finally
3. 使用 throws ,抛出异常,让调用 f2 方法的调用者(方法)处理
4. throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
5. throws 关键字后也可以是 异常列表,即可以抛出多个异常
public class Throws {
public static void main(String[] args) {
}
public void f2() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("d://aa.txt");
}
}
3. 注意事项和使用细节
-
对于编译异常,程序中必须处理,比如
try-catch
或者 throws
-
对于运行时异常,程序中如果没有处理。默认就是
throws
的方式处理 -
子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类。
- 从图中可以看出 ,
NullPointerException
是RuntimeException
的子类
class Father { //父类
public void method() throws RuntimeException {
}
}
class Son extends Father {//子类
public void method() throws NullPointerException{
}
}
- 在
throws
过程中,如果有方法try-catch
,就相当于处理异常,就可以不必throws
处理。 - 编译异常是程序员必须要处理的。而运行异常报错有默认处理机制,并不要求程序员显示处理运行异常。
- 可以看到如下
f1()
调用 f3()
报错,是因为 FileNotFoundException
是编译异常,当 f1()
调用时f3()
,必须处理f3()
的编译异常,在 f3()
中 try-catch-finally
,或者继续 throws
这个编译异常。 - 解决如下:
public static void f1() throws FileNotFoundException {
//这里大家思考问题 调用f3() 报错
//解读:
//1. 因为f3() 方法抛出的是一个编译异常
//2. 即这时,就要f1() 必须处理这个编译异常
//3. 在f1() 中,要么 try-catch-finally ,或者继续 throws 这个编译异常
f3(); // 抛出异常
}
public static void f3() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("d://aa.txt");
}
- 所以,如下可以看到 在
f4()
中调用方法f5()
是没问题的,原因是f5()
抛出的是运行异常
public static void f4() {
//解读:
//1. 在f4()中调用方法f5() 是 OK 的
//2. 原因是f5() 抛出的是运行异常
//3. 而java中,并不要求程序员显示处理运行异常,因为有默认处理机制
f5();
}
public static void f5() throws ArithmeticException {
}
默认处理的运行异常