违例匹配
“掷”出一个违例后,违例节制系统会按当初编写的顺序搜索“最靠近”的节制器。一旦找到相符的节制器,就认为违例已获得节制,不再举办更多的搜索事情。
在违例和它的节制器之间,并不需要很是准确的匹配。一个衍生类工具可与基本类的一个节制器相配,如下例所示:
//: Human.java // Catching Exception Hierarchies class 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捕捉从句。