之前写代码,有遇到一个方法在父类抛异常(class T)、子类不抛异常(class T1),或者在父类不抛异常(class T)、子类抛异常的场景(class T2);
还有是返回值类型在父类是类型T(class T)、在子类是T的子类T1(class T3),或者返回值类型在父类是类型T的子类T1(class T)、在子类是T(class T4)。
class T {
public void f1() throws Exception {}
public void f2() {}
public T f3() {return null;}
public T1 f4() {return null;}
public void f5() throws IOException {}
}
class T1 extends T {
public void f1() {}
}
class T2 extends T {
public void f2() throws Exception {}
}
class T3 extends T {
public T1 f3() {return null;}
}
class T4 extends T {
public T f4() {return null;}
}
class T5 extends T {
public T f5() throws Exception {}
}
class T6 extends T {
public void f1() throws IOException {}
}
class T7 extends T {
public T f1() throws Exception {}
}
测试可见T2和、T4、T5、T7代码错误。
具体有哪些规则?想一下可以知道,在调用一个对象T的方法时,会处理方法的返回值和异常,
如果T的子类的这个方法的返回值或异常的范围变大了【比如原本没异常的有异常了(class T2)、原本只处理异常E但现在成E的父类了(class T5)、返回值原本没有而现在有了(class T7)、返回值原本是子类现在成父类了(class T4)】,原来调用的地方就不能处理这些多余异常和返回值。
像RuntimeException这种则能随便加,因为默认是处理了这种异常的。