为什么不能处理这个异常?

Ayo*_*ssi 2 java exception

假设我有这个例外:

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方法不会抛出异常,为什么我们可以声明/抛出它?

Era*_*ran 8

你可以声明你的方法(works()在这种情况下)throws是异常,即使它没有抛出它.

原因是这将允许覆盖您的方法的子类抛出该异常(或该异常的任何子类).

另一方面,在try-catch块中,如果您尝试捕获try块不能抛出的异常,则catch块将变为死代码(即永远无法访问的代码),并且编译器不会允许它.