异常限制和构造器

阅读:288

目录介绍

  • 01.异常的限制
  • 02.构造器

01.异常的限制

  • 在覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。-->这个限制意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工作(包括异常也能工作)。
  • 针对构造器以及继承或实现的方法有几点:
    • 异常限制对构造器不起作用,构造器可以抛出任何异常,而不必理会基类构造器所抛出的异常。
    • 然而基类构造器必须以这样或那样的方式被调用(这里默认构造器将自动被调用)后,派生类构造器的异常说明就必须包含基类构造器的异常说明。
    • 派生类构造器不能捕获基类构造器抛出的异常(意味着只能抛出)。通过强制派生类遵守基类方法的异常说明,对象的可替换性得到了保证。
    • 派生类的方法可以选择不抛出任何异常,即使它是基类所定义的异常。
    • 使用派生类时,编译器只会强制要求捕获该派生类所抛出的异常;但是如果将其向上转型,那么编译器就会要求捕获基类抛出的异常。
    • 异常说明本身不属于方法类型的一部分,方法类型是由方法的名字与参数的类型组成的。因此不能基于异常说明来重载方法。
    • 一个出现在基类方法的异常说明中的异常,不一定会出现在炮声类方法的异常说明里。与继承中,基类的方法必须出现在派生类里的这种方法相比较,在继承和覆盖的过程中,某个特定方法的“异常说明的接口”是变小了的,与类方法的继承正好相反。

02.构造器

  • 对于构造器被调用时产生的异常,如果简单的使用try...catch...finally结构来处理异常,容易丢失掉异常,并且不能完成finally 内的代码逻辑,或是在不希望的情况下去完成了finally下的逻辑。对于这种情况,需要再用一层 try...catch 来捕获这个容易丢失的异常。
  • 如下:
    public static void main(String[] args) {
        try {
            InputFile in = new InputFile("Cleanup.java");
            try {
                String s;
                int i = 1;
                while ((s = in.getLine()) != null) {
                    // Perform line-by-line processing here...
                }
            } catch (Exception e) {
                System.out.println("Caught Exception in main");
                e.printStackTrace(System.out);
            } finally {
                in.dispose();
            }
        } catch (Exception e) {
            System.out.println("InputFile construction failed");
        }
    }
    


  • 在构造之后以及创建一个新的 try 块,将构造与其他可能抛出异常的逻辑区分开,这样不会让 finally 内的逻辑被意外执行。这种方式的基本规则是,在创建需要清理的对象之后,立即进入一个 try...finally 语句块。总之在创建构造器的时候,如果容易产生异常,应该仔细考虑如何处理构造器的异常。

赞赏支持


精彩留言

发表评论