java exception父类_java异常处理(父子异常的处理)

我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Java》,我才明白其中的道理,现在我再来温习一下。

一、子类方法只能抛出父类方法的异常或者是其子异常

对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常

packagethinkinginjava;public abstract classInningDemo1 {public void walk() throwsBaseException{}public abstract void sing() throwsBaseException;

}class BaseException extendsException{}class SubException1 extendsBaseException{}class CupException extends Exception{}

packagethinkinginjava;public interfaceOtherFunction {public void task() throwsRuntimeException;

}

packagethinkinginjava;public class SubInningDemo1 extends InningDemo1 implementsOtherFunction{//子类方法可以抛出父类方法的异常

@Overridepublic void walk() throwsBaseException{}//但不能抛出父类中没有的异常,否则编译会出错//public void walk() throws Exception{}//子类方法可以抛出父类方法的子异常

@Overridepublic void sing() throwsSubException1{}//当实现的接口和父类中的方法都有异常时,可以选择不抛出异常

public voidtask(){}

}

就拿这个例子来说,假如子类中有这方法 public void walk() throws CupException{},抛出了父类方法没有的异常,我们使用父类的引用指向子类

public void f(){

InningDemo1 inn = new SubInningDemo1();

inn.walk() ;//父类调用walk()方法时,并不知道它会抛出CupException,从而f()方法不知如何捕获异常。因此在编译期就要防止子类方法乱抛异常。

}

从上面的例子中,我们也可以看到,子类方法可以不抛出异常

二、子类构造器必须要抛出父类构造器的异常或者其父异常

这是因为子类构造器中默认添加了父类的构造器

packagethinkinginjava;public abstract classInningDemo2 {public InningDemo2() throwsSubException{

}

}class FatherException extendsException{}class SubException extendsFatherException{}class PenException extends Exception{}

packagethinkinginjava;public class SubInningDemo2 extendsInningDemo2{public SubInningDemo2() throwsFatherException {//子类构造器中默认添加了父类的构造器,所以需要抛出父类的异常或者其父异常//super();

}

}

三、异常丢失

1、在finally中抛出异常,可能会之前抛出的异常丢失

packagethinkinginjava;public classFinallyException {public static voidmain(String[] args){try{try{throw newRedException();

}finally{//把上一个异常覆盖掉

throw newBlueException();

}

}catch(Exception e){

System.out.println(e);

}

}

}class RedException extendsException{}class BlueException extends Exception{}

运行结果:thinkinginjava.BlueException

2、在finally中使用return,不会抛出异常

packagethinkinginjava;public classReturnException {public static voidmain(String[] args){try{throw newException();

}finally{return;

}

}

}

以上代码我们看到它抛出了异常,但运行时不会有任何输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值