(37)接口实现和覆盖时的异常特点
异常在子父类覆盖中的体现:
①:子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
举个栗子:
Exception
------AException
------BException
-------CException
Fu
------Zi
public class AException extends Exception {
}
public class BException extends AException {
private String message;
BException (String message){
super(message);
}
}
public class CException {
}
public class Fu {
public void show ()throws AException {
}
}
public class Zi extends Fu {
public void show ()throws AException//可能对此处的throwsAException不太明白,此处声明只是让调用者写trycatch时,那个
catch(AException e) 异常类名确定,然后根据多态就容易理解了。
{
//若此方法内真的会出现CException异常,那么应该在此方法内通过trycatch解决掉,而不能声明
}
}
public class Test {
public void function(Fu f)
{
try {
f.show();
} catch (AException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test t=new Test();
t.function(new Fu());
}
}
主要是对多态的理解:
t.function(new Fu());创建本类对象,没啥说的
t.function(new Zi());传到function方法中时,父类引用指向子类引用,Fu f=new Zi();在try中执行Zi类中的
show方法,若发现AException问题,能够捕捉到,并处理。
若发现子类BException问题,根据多态的特点,AException e=new BException(),catch同样能够捕捉到,
若发现是不相干CException问题,不能被捕获到,程序会结束
②如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集
③如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常
如果子类方法发生了异常,就必须要进行try处理,绝对不能抛
总结①②③就是子类不能自己找事