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
}
}
答案 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();
}
}
在Java 7或更高版本中:
void aMethod() throws IOException {
try {
Files.copy(srcePath, trgtPath); // throws IOException
}
catch(Exception ex) {
throw ex;
}
}
以上代码在Java 7中是合法的。
IOException
(因为Files.copy()
可以抛出该异常)。另外,请参见Oracle网站Rethrowing Exceptions with More Inclusive Type Checking上的这篇文章。
答案 1 :(得分:0)
由于SQLClientInfoException是“ java.lang.Exception”的子类,因此在抛出SQLClientInfoException时会被catch块捕获
catch块中的“ e”变量是指SQLClientInfoException。