声明 - 抛出与抛出 - 没有被声明的异常

Mar*_*n08 9 java exception

在Java中,双胞胎方法有什么区别?

public void methodA() throws AnException {
    //do something
    throw new AnException();
}

public void methodA() {
    //do the same thing
    throw new AnException();
}
Run Code Online (Sandbox Code Playgroud)

我有一个直觉,它与设计良好的方法有关(因为我将methodA放在一个接口中,声明它就像方法A*在其实现中所做的那样,并从Java收到警告"A*不能覆盖A因为A*不会抛出AnException").

这种猜测是否正确?

这两种做事方式还有其他微妙的内涵吗?

小智 13

如果AnException是一个已检查的异常(换句话说,如果它没有扩展RuntimeException),那么methodA将不会编译.必须始终对已检查的异常进行分解.

如果AnException是未经检查的异常(如果它确实扩展了RuntimeException),那么java编译器将允许其中任何一个,并且java运行时将对其进行等效解释.出于文档的原因,在这种情况下,methodA仍然可能仍然是首选.您的方法的javadoc将显示它可能会抛出AnException.让您的方法的用户知道他们应该期待什么样的例外是很好的.