当前位置: 首页 > 面试题库 >

多捕获块中异常问题的引用类型

司寇琨
2023-03-14
问题内容

e是Exception类型,但在以下代码中显示Exception1:

class Exception1 extends IOException {void info(){}}
class Exception2 extends Exception {}

class TestMultiCatch {
    public static void main(String args[]) {
        try {
            int a = 10;
            if (a <= 10)
                throw new Exception1();
            else
                throw new Exception2(); 
        } catch (Exception1 | Exception2 e) {
            e.info();  //line 1 error "The method info() is undefined for type Exception"
            System.out.println(e);   //prints Exception1 (after commenting line 1)
        }
    }
}

根据我的研究,“ e”应为Exception类型,它是Exception1和Exception2的通用基类。从第1行的消息可以明显看出这一点。

但是为什么:

System.out.println(e); //prints Exception1 and not Exception
System.out.println(e instanceof IOException); //prints true and not false
System.out.println(e instanceof Exception1); //prints true and not false
System.out.println(e instanceof Exception2); //false

?谢谢。


问题答案:

当您使用 多catch子句 (的Exception1 | Exception2 e形式catch),在编译时类型e是最大的类型两种类型的共同点,因为课程的代码必须处理两种类型exception.From的规范:

异常参数可以将其类型表示为单个类类型或两个或多个类类型的并集(称为替代)。联合的选择在句法上用分隔|

将异常参数表示为单个类类型 的catch子句 称为 uni-catch子句

一个其异常参数表示为类型并集的 catch子句 称为 multi-catch子句

异常参数的声明类型为,表示其类型为与替代的D1 | D2 | ... | Dn并集lub(D1, D2, ..., Dn)

…其中lub定义的最小上界这里。

如果您想使用特定于Exception1或的任何内容Exception2,请使用单独的catch块:

} catch (Exception1 e) {
    // Something using features of Exception1
} catch (Exception2 e) {
    // Something using features of Exception2
}

如果和info同时存在,则对其进行重构,以使其存在于它们的共同祖先类中:Exception1``Exception2``info

class TheAncestorException extends Exception {
    public void info() { // Or possibly make it abstract
        // ...
    }
}
class Exception1 extends TheAncestorException {
    // Optionally override `info` here
}
class Exception2 extends TheAncestorException {
    // Optionally override `info` here
}

…因此编译器可以指定e类型TheAncestorException并使其info可访问。



 类似资料:
  • 问题内容: 我想一个更清洁的方式来获得以下功能,以捕捉和在一个块: 有什么办法吗?还是我必须分开抓住它们? 并具有一个共享的基类,但它们也与其他我要介绍的类型共享它,因此我不能只抓住基类。 问题答案: 更新: 从PHP 7.1开始,此功能可用。 语法为: 文件:https://www.php.net/manual/en/language.exceptions.php#example-287 RFC

  • 问题内容: 我知道我可以做到: 我也可以这样做: 但是,如果我想在两个不同的异常中做同样的事情,那么我现在想到的最好的方法就是: 有什么办法可以做这样的事情(因为在两个异常中都采取的措施是): 现在,这确实不起作用,因为它与以下语法匹配: 因此,我捕捉两个截然不同的异常的努力并未完全实现。 有没有办法做到这一点? 问题答案: 例如,子句可以将多个异常命名为带括号的元组。 或者,仅对于Python

  • 我正在查看Java SE7的新功能,目前我正在: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html 关于捕获多重功能,当我遇到这个语句时: 注意:如果一个捕捉块处理多个异常类型,那么捕捉参数是隐式最终的。在这个例子中,捕捉参数ex是最终的,因此您不能在捕捉块中给它赋值。 我从未注意到

  • 我正在实现自定义'AuthenticationProvider'。如果没有经过身份验证,我将在'authenticate'函数中抛出异常,如下所示。 我有全局异常处理程序,如下所示。 当在'authenticate'函数内部引发异常时,不会调用全局异常处理程序。对于所有其他例外情况,它正在被调用。我想在全局异常处理程序中捕获异常并返回自定义错误消息。我怎么能那样做?感谢任何帮助。提前道谢。

  • 问题内容: 在Java 7 multicatch块中,如下所示: 什么是的编译时类型ex?这是两种异常类型共有的最派生的类吗?在此示例中,这将是。 问题答案: 是的,类型ex是双方的最具体的超类型和,这将是。 编辑:直接从 Informally, the lub (least upper bound) is the most specific supertype of the types in q

  • null 我的例外是没有被抓到。我做错了什么?