违例匹配2007-05-28 yycnet.yeah.net yyc译“掷”出一个违例后,违例控制系统会按当初编写的顺序搜索“最接近”的控制器。一旦找到相符的控制器,就认为违例已得到控制,不再进行更多的搜索工作。
在违例和它的控制器之间,并不需要非常精确的匹配。一个衍生类对象可与基础类的一个控制器相配,如下例所示:
//: Human.java// Catching Exception Hierarchiesclass Annoyance extends Exception {}class Sneeze extends Annoyance {}public class Human {public static void main(String[] args) {try {throw new Sneeze();} catch(Sneeze s) {System.out.println("Caught Sneeze");} catch(Annoyance a) {System.out.println("Caught Annoyance");}}} ///:~
Sneeze违例会被相符的第一个catch从句捕获。当然,这只是第一个。然而,假如我们删除第一个catch从句:
try {throw new Sneeze();} catch(Annoyance a) {System.out.println("Caught Annoyance");}
那么剩下的catch从句依然能够工作,因为它捕获的是Sneeze的基础类。换言之,catch(Annoyance e)能捕获一个Annoyance以及从它衍生的任何类。这一点非常重要,因为一旦我们决定为一个方法添加更多的违例,而且它们都是从相同的基础类继承的,那么客户程序员的代码就不需要更改。至少能够假定它们捕获的是基础类。
若将基础类捕获从句置于第一位,试图“屏蔽”衍生类违例,就象下面这样:
try {throw new Sneeze();} catch(Annoyance a) {System.out.println("Caught Annoyance");} catch(Sneeze s) {System.out.println("Caught Sneeze");}
则编译器会产生一条出错消息,因为它发现永远不可能抵达Sneeze捕获从句。