package com.atguigu02._throws;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* @Description
* @authr CodePerWorld Email:
* @date
*/
public class OverrideTest {
public static void main(String[] args) {
Father father = new Son();
try {
father.method1();
}catch (IOException e)
{
e.printStackTrace();
}
}
}
class Father {
public void method1() throws IOException {
}
public void method2(){
}
public void method3(){}
}
class Son extends Father{
@Override //子类重写的方法抛出的类型只能是父类方法抛出类型的相同类型或者子类,因为一旦抛出的是父类方法抛出异常类的父类,在进行多态的时候
//编译器调用父类方法,catch父类异常,但是在实际运行的时候抛出的是子类重写方法的异常,那么就会导致catch异常类比抛出异常类小,所以自然抓不住
public void method1() throws FileNotFoundException{
// public void method1() throws IOException{
}
@Override//注意父类方法没有抛出异常的时候,子类方法也不可以抛出异常,原因很简单,多态的时候,编译器看到的是父类方法没有抛出异常,如果去catch
//编译器无法判断你catch的异常是否能接住子类方法抛出的异常,因为看不到,所以不允许这种会出现错误的情况出现。当然也可以理解为,子类重写方法抛出
//异常不能超过父类被重写方法,原因同上。
public void method2(){
// public void method2() throws aaa{
}
@Override//父类没有抛出异常,子类可以抛出运行时异常,因为运行时异常是在运行是发现的,而多态不会影响到运行时执行的子类重写方法。
public void method3() throws RuntimeException{
}
}
开发中,如何选择异常处理的两种方式?
- 如果程序代码中,涉及到资源的调用,如流,数据库链接,网络连接的等,则必须考虑使用try catch finally来处理,保证不出现内存泄漏
- 如果父类被重写的方法没有throws异常类型,则子类重写的方法中如果出现异常,只能考虑使用try-catch-finally进行处理,不能throws,因为子类不能抛出异常
- 开发中,方法a中依次调用了方法b,c,d等方法,方法b,c,d之间是递进关系。此时,如果方法b,c,d中有异常,我们通常选择throws,而a中通常使用try-catch-finally