3

在 oracle 官方网站上写:( http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow

具体来说,在 Java SE 7 及更高版本中,当您在 catch 子句中声明一种或多种异常类型,并重新抛出由该 catch 块处理的异常时,编译器会验证重新抛出的异常的类型是否满足以下条件:

  • try 块能够抛出它。

  • 没有其他前面的 catch 块可以处理它。

  • 它是 catch 子句的异常参数之一的子类型或超类型。

请专注于第三点(它是 catch 子句的异常参数之一的子类型或超类型。)

它的真正含义是什么?你能给我看看这方面的例子吗?我不能清楚地理解它。

4

1 回答 1

2

子类型部分非常简单——因为所有子类型也是它们的父类型,所以允许捕获并重新抛出任何子类型是非常合法的。我相信从第一天起就是这种情况(或者至少比我记得的更早。)

至于超类型,那是在 Java 7 中添加的增强。举个例子:

public class Demo {

    static class Exception1 extends Exception{}

    public static void main(String[] args) throws Exception1 {
        try {
            throw new Exception1();
        }
        catch(Exception ex) {
            throw ex;
        }
    }

}

您最初可能期望这不会编译,因为该main()方法只声明它抛出一个类型Exception1,但 catch 参数指定Exception. 显然不是所有Exception的对象都是Exception1.

但是catch参数是一个超类型Exception1(满足上面excert的超类型要求),抛出的异常的类型throws和方法上声明的类型是一样的。因此,编译器可以验证重新抛出此异常在此上下文中是否有效,并且编译成功。

于 2019-09-02T11:45:30.173 回答