【问题标题】:Java - More Precise Rethrown FeatureJava - 更精确的重新抛出功能
【发布时间】:2020-01-05 02:24:05
【问题描述】:

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

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

  • try 块可以抛出它。

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

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

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

这到底意味着什么?你能给我看看这方面的例子吗?看不懂。

【问题讨论】:

    标签: java exception rethrow


    【解决方案1】:

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

    至于超类型,那是在 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语句中声明的类型相同方法。因此,编译器可以验证重新抛出此异常在此上下文中是否有效,并且编译成功。

    【讨论】:

    • 唯一不明白的是子类型。如果你能举出任何一个场景的例子,我会非常感激,因为我来自巴西,有些东西用英语不是很清楚。再次感谢您!
    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 2011-10-16
    • 2018-12-26
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多