1 package cn.tju.thinkinginjava.exception; 2 3 @SuppressWarnings("serial") 4 class BaseballException extends Exception {} 5 @SuppressWarnings("serial") 6 class Foul extends BaseballException {} 7 @SuppressWarnings("serial") 8 class Strike extends BaseballException {} 9 @SuppressWarnings("serial") 10 class PopFoul extends Foul {} 11 @SuppressWarnings("serial") 12 class StormException extends Exception {} 13 @SuppressWarnings("serial") 14 class RainedOut extends StormException {} 15 16 abstract class Inning { 17 /** 18 * 说明异常,但可以不抛出 19 */ 20 public Inning() throws BaseballException {} 21 22 public void event() throws BaseballException {} 23 24 public abstract void atBat() throws Strike, Foul; 25 26 public void walk() {} 27 } 28 interface Storm { 29 public void event() throws RainedOut; 30 public void rainHard() throws RainedOut; 31 } 32 33 public class StormyInning extends Inning implements Storm { 34 /** 35 * 1、可以向子类构造器中加入新的异常说明,但是必须声明基类构造器的异常 36 * */ 37 public StormyInning() throws RainedOut, BaseballException {} 38 public StormyInning(String s) throws Foul, BaseballException {} 39 40 /** 41 * 2、普通方法的异常说明必须与基类方法一致,或少于基类方法;对接口也一样 42 * */ 43 //!public void walk() throws PopFoul {} // Compile error 44 public void rainHard() throws RainedOut {} 45 46 /** 47 * 3、接口不能为基类中存在的方法扩展其异常说明,同样基类也不能为在接口中声明的方法扩展其异常说明。 48 * 某方法同时存在于基类和接口中,这种情况下,只能减少该方法的异常说明。 49 * */ 50 public void event(){} 51 /** 52 * 4、重写的方法,其异常说明中的异常类 53 * 可以是 54 * 其基类方法的异常 55 * 的 56 * 子类 57 * */ 58 public void atBat() throws PopFoul {} 59 60 public static void main(String[] args) { 61 Inning in = null; 62 try { 63 in = new StormyInning(); 64 } catch (RainedOut e) { 65 e.printStackTrace(); 66 } catch (BaseballException e) { 67 e.printStackTrace(); 68 } 69 //注意这里,需捕获Inning.atBat()抛出的异常 70 try { 71 in.atBat(); 72 } catch (Strike e) { 73 e.printStackTrace(); 74 } catch (Foul e) { 75 e.printStackTrace(); 76 } 77 78 /*----------------------------------------------------------------*/ 79 StormyInning sin = null; 80 try { 81 sin = new StormyInning(); 82 } catch (RainedOut e) { 83 e.printStackTrace(); 84 } catch (BaseballException e) { 85 e.printStackTrace(); 86 } 87 88 //注意这里,需捕获StormyInning.atBat()抛出的异常 89 try { 90 sin.atBat(); 91 } catch (PopFoul e) { 92 e.printStackTrace(); 93 } 94 } 95 }