A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Synaric 中级黑马   /  2015-10-1 11:04  /  228 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果异常具有继承体系,而我们的类也继承了某类且实现了接口,情况就复杂了
刚敲的例子:
  1. //定义一个异常的继承体系
  2. class BaseException extends Exception{}
  3. class StormException extends Exception{}
  4. class RainedOut extends StormException{}
  5. class AException extends BaseException{}
  6. class BException extends BaseException{}
  7. class UpperAException extends AException{}

  8. /*                                         |AException--------|UpperAException
  9. *                   |BaseException--------|
  10. * Exception---------|                     |BException
  11. *                   |
  12. *                   |StormException-------|RainedOut
  13. * */

  14. //演示抽象类的异常处理
  15. abstract class Inning{
  16.         public void Inning() throws BaseException{}
  17.         public void event() throws BaseException{}
  18.         public abstract void atBat() throws AException, BException;
  19.         public void walk(){}    //不抛出任何异常
  20. }

  21. //演示接口的异常处理
  22. interface Storm{
  23.         public void event() throws RainedOut;    //和抽象类一样的方法,不同异常声明
  24.         public void rainHard() throws RainedOut;
  25. }

  26. //这是我们的主要关注点
  27. class StormyInning extends Inning implements Storm{
  28.         //能为构造器添加新的异常,但必须处理已有的异常
  29.         public StormyInning() throws BaseException, RainedOut{}       
  30.         public StormyInning(String s)throws BaseException, AException{}
  31.        
  32.         //不能添加新的异常
  33.         //public void walk() throws AException{}
  34.        
  35.         //接口不能为父类继承来的方法添加新的异常
  36.         //可以不写父类的异常声明
  37.         public void event(){}
  38.        
  39.         //如果不是父类方法,则可以
  40.         @Override
  41.         public void rainHard() throws RainedOut {}
  42.        
  43.         //重写的方法可以抛出父类声明的异常的子类
  44.         @Override
  45.         public void atBat() throws UpperAException {}
  46. }

  47. public class ExceptionDemo3 {
  48.         public static void main(String[] args) {
  49.                 try {
  50.                        
  51.                         //s1必须初始化,因为有可能构造失败
  52.                         StormyInning s1 = null;
  53.                         //用子try-catch处理构造函数异常
  54.                         try {
  55.                                 s1 = new StormyInning();
  56.                         } catch (RainedOut e) {
  57.                                 e.printStackTrace();
  58.                         } catch (BaseException e) {
  59.                                 e.printStackTrace();
  60.                         }
  61.                         s1.atBat();
  62.                        
  63.                 } catch (UpperAException e) {
  64.                         System.out.println("UpperAException");
  65.                 }
  66.                
  67.                 //看看向上转型会发生什么
  68.                 Inning s2 = null;
  69.                 try {               
  70.                         s2 = new StormyInning();       
  71.                 } catch (RainedOut | BaseException e) {
  72.                         //必须处理基类声明的异常
  73.                         System.out.println("RainedOut");
  74.                 }
  75.                
  76.                 //只能抛出基类声明的异常
  77.                 try {
  78.                         s2.atBat();
  79.                 } catch (AException | BException e) {
  80.                         System.out.println("A or BException");
  81.                 }
  82.         }
  83. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马