• 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实训项目--影碟管理软件
    《Java从入门到精通》第十二章学习笔记
    《Java从入门到精通》第十一章学习笔记
    《Java从入门到精通》第十章学习笔记
    《Java从入门到精通》第九章学习笔记
    Swift游戏实战-跑酷熊猫 02 创建熊猫类
    Swift游戏实战-跑酷熊猫 01 创建工程导入素材
    Swift游戏实战-跑酷熊猫 00 游戏预览
    Swift游戏实战-跑酷熊猫(一) 简介 (含源代码)
  • 原文地址:https://www.cnblogs.com/jenkinschan/p/5847470.html
Copyright © 2020-2023  润新知