来一个例子
//OverrideTest.java
package com.ylaihui.exception;import java.io.FileNotFoundException;
import java.io.IOException;public class OverrideTest {public static void main(String[] args) {OverrideTest test = new OverrideTest();test.display(new SubClass());}public void display(SuperClass s){try {s.method();} catch (IOException e) { // SuperClass 抛出的异常是 IOException,处理 IOException 异常// 如果子类抛出的异常更大,那么 父类就无法 catch 子类的异常。// 所以禁止子类抛出的异常更大e.printStackTrace();}}
}class SuperClass{public void method() throws IOException{}
}class SubClass extends SuperClass{// 子类重写的方法抛出的异常类型小于等于父类被重写的方法抛出的异常类型public void method()throws FileNotFoundException{ }
}
反证法
如果子类重写的方法抛出的异常更大,那么在多态的情况下, 父类的引用调用的方法只能看到小范围的异常,代码运行的时候,才知道具体是调用了那个子类对象的方法,如果此时子类对象的方法抛出的异常更大,从逻辑上来说,是错误的。
异常处理的经验总结
1.如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。因为子类重写的方法抛出的异常类型小于等于父类被重写的方法抛出的异常类型
2. 执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理,这样可使代码更整洁,可读性更高。