Java - 更精确的重新抛出功能

Lui*_*ndo 5 java exception rethrow

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

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

  • try 块能够抛出它。

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

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

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

这到底意味着什么?你能给我举一些例子吗?我无法清楚地理解它。

Mic*_*rry 5

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

至于超类型,这是 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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

您最初可能希望该方法无法编译,因为该main()方法仅声明它抛出 类型Exception1,但 catch 参数指定Exception。显然并非所有Exception对象都是Exception1

但是,该catch参数是 的超类型(满足上面摘录的超类型要求),并且抛出的异常的类型与方法上的语句Exception1中声明的类型相同。throws因此,编译器可以验证在此上下文中重新抛出此异常是否有效,并且编译成功。