Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 405|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-27 17:09:58 | 显示全部楼层 |阅读模式

      我当初学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;
            }
        }
    }

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

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-4 15:06 , Processed in 0.057814 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表