假设我有这个例外:
class NoMoreCarrotsException extends Exception {}
Run Code Online (Sandbox Code Playgroud)
这是一个已检查的异常,因此必须处理或声明它.
假设我有这个方法:
private static void eatCarrot(){}
Run Code Online (Sandbox Code Playgroud)
public void fails(){
try{
eatCarrot();
}catch(NoMoreCarrotsException e){}
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
public void works() throws NoMoreCarrotsException {
eatCarrot();
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个工作但不是第一个工作?该eatCarrot方法不会抛出异常,为什么我们可以声明/抛出它?
你可以声明你的方法(works()在这种情况下)throws是异常,即使它没有抛出它.
原因是这将允许覆盖您的方法的子类抛出该异常(或该异常的任何子类).
另一方面,在try-catch块中,如果您尝试捕获try块不能抛出的异常,则catch块将变为死代码(即永远无法访问的代码),并且编译器不会允许它.