Java-更精确的更新功能

时间:2019-09-02 00:13:52

标签: 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子句的异常参数之一的子类型或超类型。)

那真的意味着什么?你能给我看看例子吗?我不太清楚。

1 个答案:

答案 0 :(得分: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的超类型(满足上述对专家的超类型要求),并且抛出的异常的类型与{{ 1}}方法的声明。因此,编译器可以验证重新抛出此异常在此上下文中是否有效,并且编译成功。

相关问题