浅谈java异常处理(父子异常的处理)

网友投稿 221 2023-07-07


浅谈java异常处理(父子异常的处理)

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

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

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

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 absthttp://ract class InningDemo2 {

public InningDemo2() throws SubException{

}

}

class FatherException extends Exception{}

class SubException extends FatherException{}

class PenException extends Exception{}

package thinkinginjaJXihgYVksva;

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;

}

}

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java爬虫 信息抓取的实现
下一篇:基于java涉及父子类的异常详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~