众所周之,java中子类在覆盖父类方法时,如果父类抛出了异常,子类必须也必须抛出父类的异常或者异常的子类。
下面用用代码来证明这一结论:
package cn.itcast.exception; //下面定义三个自定义异常类,它们之间的关系如下: /* Exception |--AException |--BException |--CException */ class AException extends Exception { public AException(String msg) { super(msg); } } class BException extends AException { public BException(String msg) { super(msg); } } class CException extends Exception { public CException(String msg) { super(msg); } } //测试类 class Test { public void function(Fu f) { try { f.show(); } catch (AException e) { System.out.println(e.toString()); } } } //定义父类并定义一个show方法抛出A异常 class Fu { public void show() throws AException { System.out.println("I am father"); throw new AException("AEception by fu"); } } //定义子类覆盖父类show()方法 class Zi extends Fu { public void show() throws BException { System.out.println("I am son"); throw new BException("AException by zi"); } } public class ExceptionDemo { public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); t.function(new Zi()); } }
上面的代码中,测试类Test的function的参数是父类Fu,调用f引用的show()方法,如果捕获异常的话,就应该捕获Fu的show方法的异常或其父类,这样才不会违背多态的特性。
但在传入function的参数时,传递是Fu的Zi类型对象,又用到了多态。f.show()调用的是子类的show方法,如果子类的show方法抛出非Fu类的show()方法的异常或其子类,必然会打破多态特性。