Java 抛出子异常,捕获为超级异常并重新抛出,但声明抛出子异常

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

Java文档清楚地解释了在处理类型转换、overriding方法的返回类型以及抛出和捕获异常时对象的一致性。但现在我有点对异常感到困惑,这段代码背后隐藏的概念是什么

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块中可能出现的实际异常
  • 如果不进行更改,则无法更改引发的异常类型 方法签名
在Java 7或更高版本中:

上述代码在Java7中是合法的

  • 如果在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;
    }
}