浅谈java异常处理(父子异常的处理)
我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《ThinkinginJava》,我才明白其中的道理,现在我再来温习一下。
一、子类方法只能抛出父类方法的异常或者是其子异常
对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常
packagethinkinginjava;
publicabstractclassInningDemo1{
publicvoidwalk()throwsBaseException{}
publicabstractvoidsing()throwsBaseException;
}
classBaseExceptionextendsException{}
classSubException1extendsBaseException{}
classCupExceptionextendsException{}
packagethinkinginjava;
publicinterfaceOtherFunction{
publicvoidtask()throwsRuntimeException;
}
packagethinkinginjava;
publicclassSubInningDemo1extendsInningDemo1implementsOtherFunction{
//子类方法可以抛出父类方法的异常
@Override
publicvoidwalk()throwsBaseException{}
//但不能抛出父类中没有的异常,否则编译会出错
//publicvoidwalk()throwsException{}
//子类方法可以抛出父类方法的子异常
@Override
publicvoidsing()throwsSubException1{}
//当实现的接口和父类中的方法都有异常时,可以选择不抛出异常
publicvoidtask(){}
}
就拿这个例子来说,假如子类中有这方法publicvoidwalk()throwsCupException{},抛出了父类方法没有的异常,我们使用父类的引用指向子类
publicvoidf(){
InningDemo1inn=newSubInningDemo1();
inn.walk();//父类调用walk()方法时,并不知道它会抛出CupException,从而f()方法不知如何捕获异常。因此在编译期就要防止子类方法乱抛异常。
}
从上面的例子中,我们也可以看到,子类方法可以不抛出异常
二、子类构造器必须要抛出父类构造器的异常或者其父异常
这是因为子类构造器中默认添加了父类的构造器
packagethinkinginjava;
publicabstractclassInningDemo2{
publicInningDemo2()throwsSubException{
}
}
classFatherExceptionextendsException{}
classSubExceptionextendsFatherException{}
classPenExceptionextendsException{}
packagethinkinginjava;
publicclassSubInningDemo2extendsInningDemo2{
publicSubInningDemo2()throwsFatherException{
//子类构造器中默认添加了父类的构造器,所以需要抛出父类的异常或者其父异常
//super();
}
}
三、异常丢失
1、在finally中抛出异常,可能会之前抛出的异常丢失
packagethinkinginjava;
publicclassFinallyException{
publicstaticvoidmain(String[]args){
try{
try{
thrownewRedException();
}finally{
//把上一个异常覆盖掉
thrownewBlueException();
}
}catch(Exceptione){
System.out.println(e);
}
}
}
classRedExceptionextendsException{}
classBlueExceptionextendsException{}
运行结果:thinkinginjava.BlueException
2、在finally中使用return,不会抛出异常
packagethinkinginjava;
publicclassReturnException{
publicstaticvoidmain(String[]args){
try{
thrownewException();
}finally{
return;
}
}
}
以上代码我们看到它抛出了异常,但运行时不会有任何输出
以上这篇浅谈java异常处理(父子异常的处理)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。