文章目录


1. 基本介绍

  1. 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
  2. 在方法声明中用​​throws​​​语句可以声明抛出异常的列表,​​throws​​后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

2. 快速入门案例

【JavaSE】throws 异常处理_父类

解读:
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. 注意事项和使用细节

  1. 对于编译异常,程序中必须处理,比如​​try-catch​​ 或者 ​​throws​

  2. 对于运行时异常,程序中如果没有处理。默认就是​​throws​​的方式处理
    【JavaSE】throws 异常处理_父类_02
    【JavaSE】throws 异常处理_throws 异常处理_03

  3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常​一致​,要么为父类抛出的异常的类型的​子类​。
    【JavaSE】throws 异常处理_throws 异常处理_04

  • 从图中可以看出 ,​​NullPointerException​​​ 是​​RuntimeException​​ 的子类
class Father { //父类
public void method() throws RuntimeException {

}
}

class Son extends Father {//子类

@Override
public void method() throws NullPointerException{

}
}
  1. 在​​throws​​​过程中,如果有方法​​try-catch​​​,就相当于处理异常,就可以不必​​throws​​处理。
  2. 编译异常​是程序员必须要处理的。而​运行异常​报错有默认处理机制,并不要求程序员显示处理运行异常。
  • 可以看到如下 ​​f1()​​ 调用 ​​f3()​​ 报错,是因为 ​​FileNotFoundException​​ 是编译异常,当 ​​f1()​​ 调用时​​f3()​​,必须处理​​f3()​​的编译异常,在 ​​f3()​​中 ​​try-catch-finally​​ ,或者继续 ​​throws​​ 这个编译异常。
    【JavaSE】throws 异常处理_父类_05
  • 解决如下:
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 {

}

默认处理的运行异常

【JavaSE】throws 异常处理_throws 异常处理_06