Java 抛出子异常,捕获为超级异常并重新抛出,但声明抛出子异常
Java文档清楚地解释了在处理类型转换、overriding方法的返回类型以及抛出和捕获异常时对象的一致性。但现在我有点对异常感到困惑,这段代码背后隐藏的概念是什么Java 抛出子异常,捕获为超级异常并重新抛出,但声明抛出子异常,java,exception,exception-handling,Java,Exception,Exception Handling,Java文档清楚地解释了在处理类型转换、overriding方法的返回类型以及抛出和捕获异常时对象的一致性。但现在我有点对异常感到困惑,这段代码背后隐藏的概念是什么 void getNames() throws SQLClientInfoException { /*throws Subclass object to caller*/ try{ // throwing Subclass object to catch block but up-casting to Exce
void getNames() throws SQLClientInfoException { /*throws Subclass object to caller*/
try{
// throwing Subclass object to catch block but up-casting to Exception
throw new SQLClientInfoException();
} catch (Exception e) {
throw e; /* re-throwing throwing as Exception
}
}
因为SQLClientInfoException是“java.lang.Exception”的子类,所以当抛出SQLClientInfoException时,它被catch块捕获
catch块中的“e”变量引用SQLClientInfo异常。这是Java SE 7中引入的编程语言的一个特性-使用更精确的重新抛出异常 与早期版本的Java相比,JavaSE7编译器对重新抛出的异常执行更精确的分析。这样可以在方法声明的throws子句中指定更具体的异常类型 Java 7之前的版本:
- 在catch块中重新抛出异常不需要指示 try块中可能出现的实际异常
- 如果不进行更改,则无法更改引发的异常类型 方法签名
- 如果在try子句中引发了某种类型的异常,并且在catch子句中没有为其分配异常变量,则编译器将复制可从try块中引发的已检查异常类型。(这就像在没有重新分配异常变量的情况下,从try块抛出所有可能的异常一样)
- 编译器知道唯一可能的异常类型是
(因为IOException
可以抛出这种异常)Files.copy()
另外,请参阅Oracle网站上的这篇文章:。非常感谢@prasad的链接。您是对的@mfe,但在这个场景中,我从catch抛出异常,并声明抛出异常的子类
void aMethod() throws CustomDbException {
try {
// code that throws SQLException
}
catch(SQLException ex) {
throw new CustomDbException();
}
}
void aMethod() throws IOException {
try {
Files.copy(srcePath, trgtPath); // throws IOException
}
catch(Exception ex) {
throw ex;
}
}