Java-更精确的重试功能
在oracle官方网站上写:() 具体地说,在Java SE 7及更高版本中,当您在catch子句中声明一个或多个异常类型,并重新抛出此catch块处理的异常时,编译器将验证重新抛出异常的类型是否满足以下条件:Java-更精确的重试功能,java,exception,rethrow,Java,Exception,Rethrow,在oracle官方网站上写:() 具体地说,在Java SE 7及更高版本中,当您在catch子句中声明一个或多个异常类型,并重新抛出此catch块处理的异常时,编译器将验证重新抛出异常的类型是否满足以下条件: 试块可以把它扔出去 没有其他前面的catch块可以处理它 它是catch子句异常参数之一的子类型或超类型 请关注第三点(它是catch子句异常参数之一的子类型或超类型) 这到底意味着什么?你能给我举个例子吗?我不能很清楚地理解它。子类型部分非常简单-因为所有子类型也是它们的父类型,所
- 试块可以把它扔出去
- 没有其他前面的catch块可以处理它
- 它是catch子句异常参数之一的子类型或超类型
这到底意味着什么?你能给我举个例子吗?我不能很清楚地理解它。子类型部分非常简单-因为所有子类型也是它们的父类型,所以允许捕获和重新调用任何子类型都是非常合法的。我相信从第一天起就是这样(或者至少在我记忆最深刻的时候) 至于超类型,这是Java7中添加的一个增强。以以下为例:
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
语句中声明的类型相同。因此,编译器可以验证在此上下文中重新引用此异常是否有效,并且编译成功。我唯一不了解的部分是子类型。如果你能举出任何一个发生的情况的例子,我将非常感谢,因为我来自巴西,有些英语对我来说不太清楚。再次感谢你!