一、异常处理机制二:声明抛出异常
1、声明抛出异常
声明抛出异常是 Java 中处理异常的第二种方式
(1)如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
(2)在方法声明中用 throws 语句可以声明抛出异常的列表,throws 后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
(3)throws 关键字:异常处理的第二种方式,在当前方法中不处理,抛给调用者处理。
(4)throws 作用:① 当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象;
② 可以使用 throws 关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理-->中断处理
2、语法格式
修饰符 返回值类型 方法名(参数列表) throws AAAExcepiton,BBBExcepiton...{
throw new AAAExcepiton("产生原因");
throw new BBBExcepiton("产生原因");
...
}
注意:
(1)throws 关键字必须写在方法声明处;
(2)throws 关键字后边声明的异常必须是 Exception 或者是 Exception 的子类;
(3)方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常,如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可;
(4)调用了一个声明抛出异常的方法,我们就必须的处理声明的异常:
① 要么继续使用 throws 声明抛出,交给方法的调用者处理,最终交给JVM
② 要么 try...catch 自己处理异常
Demo:
1 public class ThrowsDemo {
2 public static void main(String[] args) throws IOException {
3 read("c:\\a.tx");
4 }
5 public static void readFile(String fileName) throws FileNotFoundException,IOException{
6 if(!fileName.equals("c:\\a.txt")){
7 throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
8 }
9
10 /*
11 如果传递的路径,不是.txt结尾
12 那么我们就抛出IO异常对象,告知方法的调用者,文件的后缀名不对
13
14 */
15 if(!fileName.endsWith(".txt")){
16 throw new IOException("文件的后缀名不对");
17 }
18
19 System.out.println("路径没有问题,读取文件");
20 }
21 }
注意:
(1)FileNotFoundException extends IOException extends Excepiton, 如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可;
(2)FileNotFoundException是编译异常,抛出了编译异常,就必须处理这个异常,可以使用throws继续声明抛出FileNotFoundException这个异常对象,让方法的调用者处理。
3、图解
4、两种处理区别:
① try-catch-finally:真正的将异常给处理掉了。
② throws的方式只是将异常抛给了方法的调用者。 并没有真正将异常处理掉。
5、如何选择使用try-catch-finally 还是使用throws?
① 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理;
② 执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用 throws 的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。
二、重写方法声明抛出异常的原则
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
在多态的情况下,对 methodA() 方法的调用 - 异常的捕获按父类声明的异常处理: