我无法理解在 Java 7 及更高版本中精确重新抛出的工作原理。正如https://www.theserverside.com/tutorial/OCPJP-Use-more-precise-rethrow-in-exceptions-Objective-Java-7中所指出的 ,在 Java 7 及更高版本中,我们可以throws
在方法声明,以逗号分隔的方法可能抛出的特定异常列表。如果所有这些异常都是一般异常的子类型java.lang.Exception
,我们将能够在捕获此超类型的 catch 块中捕获它们中的任何一个,同时让客户端代码(例如调用者方法)知道实际发生了哪些可能的子类型异常.
最初,我认为为了让客户端代码知道实际发生了哪个异常,我们需要在throws
子句中指定特定异常的列表。然而,在下面的示例中,客户端代码(main()
方法)似乎能够检索该信息,即使我们仅在被调用方法java.lang.Exception
的throws
子句中指定异常。因此,我的问题是:
为什么不管throws
方法的子句runException()
是throws ExceptionA, ExceptionB
or ,下面的代码输出都一样throws Exception
?
我在 Eclipse 中使用 Oracle JVM-12。提前致谢!
class ExceptionA extends Exception{}
class ExceptionB extends Exception{}
public class RethrowingAndTypeChecking{
public static void runException(char what) throws Exception{
//public static void runException(char what) throws ExceptionA, ExceptionB{
try{
if(what == 'A')
throw new ExceptionA();
else if (what == 'B')
throw new ExceptionB();
}
catch(Exception e){
throw e;
}
}
public static void main (String args[]){
char ch;
for (int i=0;i<2;i++) {
if(i==0) ch='A';
else ch = 'B';
try{
runException(ch);
}
catch(ExceptionA e){
System.out.print("In main(), 'catch(ExceptionA e){}', caught exception: " + e.getClass());
}
catch(ExceptionB e){
System.out.print("In main(), 'catch(ExceptionB e){}', caught exception: " + e.getClass());
}
catch(Exception e){
System.out.print("In main(), 'catch(Exception e){}', caught exception: " + e.getClass());
}
System.out.println();
}
}
}
输出:
In main(), 'catch(ExceptionA e){}', caught exception: class ExceptionA
In main(), 'catch(ExceptionB e){}', caught exception: class ExceptionB