这篇文章为大家讲解异常匹配
我想我需要讲清楚一个问题就是:抛出异常后,如果有多个异常处理程序,如何去进行选择?
(1)通常情况下,异常处理系统会按照代码的书写顺序找出“最近的”处理程序。
更多的查找的时候,其实并不要求抛出的异常同异常处理程序所声明的异常完全匹配。
这意味着:派生类的对象也可以匹配其基类的处理程序:
class Annoyance extends Exception{}
class Sneeze extends Annoyance{}
public class Human {
public static void main(String[] args) {
//Catch the exact type:
try {
throw new Sneeze();
}catch(Sneeze e) {
System.out.println("Caught Sneeze");
}catch(Annoyance e) {
System.out.println("Caught Annoyance");
}
//catch base type:
try {
throw new Sneeze();
}catch(Annoyance a) {
System.out.println("Caught Annoyance");
}
}
}
运行结果:
也就是说:如果决定在方法中加上更多的派生异常的话,只要客户端程序员捕获的是基类异常,代码是无需更改的。
将捕获基类的catch子句放在最前面,以此想把派生类的异常给“屏蔽”掉,如下所示:
try{
throw new Sneeze();
}catch(Annoyance e){
//...
}catch(Sneeze e){
//...
}
但如此的话,编译器就会发现Sneeze的catch子句永远也得不到执行,会报错。
有这样一个问题需要大家去解答:基类异常是否可以捕获派生类?欢迎大家一起讨论?
谢谢大家!