浅谈java异常处理(父子异常的处理)
程序员文章站
2024-03-13 18:41:09
我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那...
我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《thinking in java》,我才明白其中的道理,现在我再来温习一下。
一、子类方法只能抛出父类方法的异常或者是其子异常
对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常
package thinkinginjava; public abstract class inningdemo1 { public void walk() throws baseexception{} public abstract void sing() throws baseexception; } class baseexception extends exception{} class subexception1 extends baseexception{} class cupexception extends exception{}
package thinkinginjava; public interface otherfunction { public void task() throws runtimeexception; }
package thinkinginjava; public class subinningdemo1 extends inningdemo1 implements otherfunction{ //子类方法可以抛出父类方法的异常 @override public void walk() throws baseexception{} //但不能抛出父类中没有的异常,否则编译会出错 //public void walk() throws exception{} //子类方法可以抛出父类方法的子异常 @override public void sing() throws subexception1{} //当实现的接口和父类中的方法都有异常时,可以选择不抛出异常 public void task(){} }
就拿这个例子来说,假如子类中有这方法 public void walk() throws cupexception{},抛出了父类方法没有的异常,我们使用父类的引用指向子类
public void f(){ inningdemo1 inn = new subinningdemo1(); inn.walk() ;//父类调用walk()方法时,并不知道它会抛出cupexception,从而f()方法不知如何捕获异常。因此在编译期就要防止子类方法乱抛异常。 }
从上面的例子中,我们也可以看到,子类方法可以不抛出异常
二、子类构造器必须要抛出父类构造器的异常或者其父异常
这是因为子类构造器中默认添加了父类的构造器
package thinkinginjava; public abstract class inningdemo2 { public inningdemo2() throws subexception{ } } class fatherexception extends exception{} class subexception extends fatherexception{} class penexception extends exception{}
package thinkinginjava; public class subinningdemo2 extends inningdemo2{ public subinningdemo2() throws fatherexception { //子类构造器中默认添加了父类的构造器,所以需要抛出父类的异常或者其父异常 //super(); } }
三、异常丢失
1、在finally中抛出异常,可能会之前抛出的异常丢失
package thinkinginjava; public class finallyexception { public static void main(string[] args){ try{ try{ throw new redexception(); }finally{ //把上一个异常覆盖掉 throw new blueexception(); } }catch(exception e){ system.out.println(e); } } } class redexception extends exception{} class blueexception extends exception{}
运行结果:thinkinginjava.blueexception
2、在finally中使用return,不会抛出异常
package thinkinginjava; public class returnexception { public static void main(string[] args){ try{ throw new exception(); }finally{ return; } } }
以上代码我们看到它抛出了异常,但运行时不会有任何输出
以上这篇浅谈java异常处理(父子异常的处理)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: 图文详解Java中class的初始化顺序