鉴于以下计划:
class FirstException extends Exception {}
class SecondException extends Exception {}
class RethrowException {
public void rethrowMethod() throws FirstException, SecondException {
boolean flag = true;
try {
if(flag)
throw new FirstException();
else
throw new SecondException();
}
catch(Exception ex) {
throw ex; // does not compile "Unhandled exception type Exception"
}
}
}
这个错误恰好发生在Java SE 6(或之前的版本)上,因为首先,当我们构建" catch" block(catch(Exception ex)),ex指定的异常对象的类型为FirstException
(或SecondException)。但是,当重新抛出ex
(throw ex
)时,Java编译器执行如下3个任务:
FirstException
(或SecondException
)的实例因此,在Java SE 6中,我们不能使用"更准确地说是重新抛出异常"因为以下原因。但是,在Java SE 7(或更高版本)中,我们可以这样做,因为当我们重新抛出ex
时,运行时系统不会释放和初始化新对象ex
。它将检查(查找)ex1 come from (the try block above), and so know that
ex is an instance of
FirstException or
SecondException`。
我上面的解释是否正确?
答案 0 :(得分:2)
在Java上的任何版本中,通过捕获异常并从catch
块中抛出异常,不会创建新的异常实例。
在Java 6-中,被捕获的异常的类型被Exception
块声明为catch
,因此这就是编译器认为被抛出的内容。 / p>
在更高版本中,异常的类型被推断为仅限于可以从try
块中抛出的内容。