java炒冷饭系列06 异常匹配
2017-06-20 06:36
120 查看
前言
抛出异常的时候,异常处理系统会按照代码的书写顺序找出“最近”的处理程序。找到匹配的处理程序之后,它就认为异常将得到处理,然后就不再继续查找。查找的时候并不要求抛出的异常同处理程序所声明的异常完全匹配。派生类的对象也可以匹配其基类的处理程序,你像这样:
class Annoyance extends Exception { } class Sneeze extends Annoyance { } public class Human { public static void main(String[] args) { try { throw new Sneeze(); } catch (Sneeze sneeze) { System.out.println("Caught Sneeze"); } catch (Annoyance annoyance) { System.out.println("Caught Annoyance"); } try { throw new Sneeze(); } catch (Annoyance annoyance) { System.out.println("Caught Annoyance"); } } }
Sneeze异常会被第一个匹配的catch子句捕获,也就是程序里的第一个。然而如果将这个catch子句删掉,只留Annoyance的catch子句,该程序仍然能运行,因为这次捕获的是Sneeze的基类。换句话说,catch(Annoyance e)会捕获Annoyance以及所有从它派生的异常。这一点非常有用,因为如果决定在方法里加上更多派生异常的话,只要客户程序员捕获的是基类异常,那么它们的代码就无需更改。
如果把捕获基类的catch子句放在最前面,以此想把派生类的异常全给“屏蔽”掉,就像这样:
try{ throw new Sneeze(); }catch(Annoyance a){ }catch(Sneeze s){ }
这样编译器就会发现Sneeze的catch子句永远也得不到执行,因此它会向你报告错误。
这里还有个小小的练习:建立一个三层的异常继承体系,然后创建基类A,它的一个方法能抛出异常体系的基类异常。让B继承A,并且覆盖这个方法,让它抛出第二层的异常。让C继承B,再次覆盖这个方法,让它抛出第三层的异常。在main()里创建一个C类型的对象,把它向上转型为A,然后调用这个方法。
我给的答案
class Ea extends Exception { } class Eb extends Ea { } class Ec extends Eb { } public class CA { public void method() throws Ea{ throw new Ea(); } public static void main(String[] args) throws Ea { CA ca = new CC(); ca.method(); } } class CB extends CA{ public void method() throws Eb{ throw new Eb(); } } class CC extends CB { public void method() throws Ec { throw new Ec(); } }
这个练习也证明了
多态,虽然main方法处声明了Ea异常,但是实现上抛出的是其子类Ec异常
参考文献
《java编程思想》12.11异常匹配相关文章推荐
- java炒冷饭系列06 异常说明(throws)
- java炒冷饭系列07 java标准异常
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- JavaSE系列第二篇——java异常机制
- Java多线程系列--“JUC锁”06之 Condition条件
- Java系列:《Java核心技术 卷一》学习笔记,cchapter11 异常
- java中异常处理中的异常匹配
- 恶补 Java 系列之异常
- Java多线程系列--“JUC线程池”06之 Callable和Future
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- java系列笔记---异常
- java系列笔记---异常
- java系列笔记---异常
- Java多线程系列--【JUC锁06】-Condition条件
- Java多线程系列--【JUC集合06】- ConcurrentSkipListSet
- Java多线程系列--“基础篇”06之 线程让步
- 8.偏头痛杨的Java入门教学系列之异常篇
- Java集合系列06之 Vector详细介绍
- java系列笔记---异常
- java炒冷饭系列12 嵌套类(静态内部类)