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

 更新时间:2016年09月07日 09:57:29   投稿:jingxian  
下面小编就为大家带来一篇浅谈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异常处理(父子异常的处理)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot发布dubbo服务注册到nacos实现方式

    springboot发布dubbo服务注册到nacos实现方式

    这篇文章主要介绍了springboot发布dubbo服务注册到nacos实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot自定义转换器应用实例讲解

    SpringBoot自定义转换器应用实例讲解

    SpringBoot在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器,SpringBoot 也支持自定义转换器,这个内置转换器在 debug的时候,可以看到,提供了124个内置转换器
    2022-08-08
  • java解析{{}}变量名以及文本内容替换操作

    java解析{{}}变量名以及文本内容替换操作

    这篇文章主要介绍了java解析{{}}变量名以及文本内容替换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java中继承、多态、重载和重写介绍

    Java中继承、多态、重载和重写介绍

    这篇文章主要介绍了Java中继承、多态、重载和重写介绍,需要的朋友可以参考下
    2014-07-07
  • Java线程的联合用法实例分析

    Java线程的联合用法实例分析

    这篇文章主要介绍了Java线程的联合用法,结合实例形式分析了java线程联合的原理、实现方法及相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • SpringBoot跨域Jsonp和Cors的方法

    SpringBoot跨域Jsonp和Cors的方法

    这篇文章主要介绍了SpringBoot跨域Jsonp和Cors的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 详解Mybatis中常用的约束文件

    详解Mybatis中常用的约束文件

    这篇文章主要介绍了详解Mybatis中常用的约束文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • java对象拷贝详解及实例

    java对象拷贝详解及实例

    这篇文章主要介绍了java对象拷贝详解及实例的相关资料,需要的朋友可以参考下
    2017-04-04
  • SpringBoot启动时自动执行代码的几种实现方式

    SpringBoot启动时自动执行代码的几种实现方式

    这篇文章主要给大家介绍了关于SpringBoot启动时自动执行代码的几种实现方式,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • 利用Java8 Optional如何避免空指针异常详解

    利用Java8 Optional如何避免空指针异常详解

    Optional可以让你的代码具有可读性,且会避免出现空指针异常。 下面这篇文章主要给大家介绍了关于利用Java8 Optional如何避免空指针异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-01-01

最新评论