在Java中,双胞胎方法有什么区别?
public void methodA() throws AnException { //do something throw new AnException(); } public void methodA() { //do the same thing throw new AnException(); }
我有一个直觉,它与设计良好的方法有关(因为我将methodA放在一个接口中,声明它就像方法A*在其实现中所做的那样,并从Java收到警告"A*不能覆盖A因为A*不会抛出AnException").
这种猜测是否正确?
这两种做事方式还有其他微妙的内涵吗?
如果AnException是一个已检查的异常(换句话说,如果它没有扩展RuntimeException),那么methodA将不会编译.必须始终对已检查的异常进行分解.
如果AnException是未经检查的异常(如果它确实扩展了RuntimeException),那么java编译器将允许其中任何一个,并且java运行时将对其进行等效解释.出于文档的原因,在这种情况下,methodA仍然可能仍然是首选.您的方法的javadoc将显示它可能会抛出AnException.让您的方法的用户知道他们应该期待什么样的例外是很好的.