欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈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异常处理(父子异常的处理)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。