抛出Sub-Exception,捕获为Super Exception,然后重新抛出,但声明抛出Sub-Exception

时间:2019-01-21 07:36:03

标签: java exception exception-handling

Java文档清楚地说明了对象一致性,同时处理类型转换,返回Over-riding方法的类型以及引发和捕获异常。但是现在我对异常几乎没有困惑,此代码背后的隐藏概念是什么。

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 
    }
}

2 个答案:

答案 0 :(得分:1)

它是Java SE 7中引入的编程语言的功能-在异常中使用更精确的重新抛出。

与Java的早期版本相比,Java SE 7编译器对重新抛出的异常执行更精确的分析。这样可以在方法声明的throws子句中指定更具体的异常类型。

Java 7之前的版本:

void aMethod() throws CustomDbException {
    try {
        // code that throws SQLException
    }
    catch(SQLException ex) {
        throw new CustomDbException();
    }
}
  • 在catch块中重新引发异常无需表示 try块中可能存在实际的异常。
  • 无法更改抛出的异常类型,而无需更改 方法签名。

在Java 7或更高版本中:

void aMethod() throws IOException {
    try {
        Files.copy(srcePath, trgtPath); // throws IOException
    }
    catch(Exception ex) {
        throw ex;
    }
}

以上代码在Java 7中是合法的。

  • 如果在try子句中引发了某种类型的异常,而在catch子句中未为其分配异常变量,则编译器将复制可从try块中抛出的已检查异常类型。 (如果未重新分配异常变量,就好像抛出了try块中所有可能的异常一样。)
  • 编译器知道唯一可能的异常类型是IOException(因为Files.copy()可以抛出该异常)。

另外,请参见Oracle网站Rethrowing Exceptions with More Inclusive Type Checking上的这篇文章。

答案 1 :(得分:0)

由于SQLClientInfoException是“ java.lang.Exception”的子类,因此在抛出SQLClientInfoException时会被catch块捕获

catch块中的

“ e”变量是指SQLClientInfoException。