考虑以下接口(interface):
public interface Generator {
String generate() throws IOException;
}
以及以下实现:
public class EmptyStringGenerator implements Generator {
@Override
public String generate() {
return "";
}
}
请注意,我省略了
throws IOException
接口(interface)中指定的签名的Generator
部分。但是,没有编译器错误,没有编译器警告,甚至@Override
注释也没有抱怨。我知道这按预期工作。但是,我想知道其背后的意图。如果我的方法没有实际抛出
IOException
,那就最好不抛出它,而不必从签名中删除它。但是,如果确实从EmptyStringGenerator
的方法签名中将其删除,则将强制此类的所有当前和将来的子类放弃引发在接口(interface)中实际指定的异常的可能性。对我来说,这听起来像是一项功能,实际上并没有给您带来任何好处(除了保存几次击键之外,这根本不是什么好处),但是在实际使用时可能会导致严重的错误。
因此,我的问题实际上是这样的:在派生类中忽略
throws
异常有什么意义?这种可能性解决的问题是什么?为什么允许这样做?更新
对于那些问“但是危害在哪里?”的人来说,这是我的评论之一。顺便说一句,它并不牵强,因为这正是我现在正在处理的内容:
程序员A指定接口(interface)I。程序员B编写实现类X,但忘记添加抛出。他也从不注意,因为这里甚至没有发出警告。程序员C编写了从X类继承的实现类Y,他甚至还特别希望将抛出该异常,因为他要抛出异常。但是,即使界面有规定,由于B的疏忽,他现在也不再被允许这样做。实际上,不再允许他在此处使用该异常。那是很大的伤害。特别是如果X类不在您的控制之下。
最佳答案
如果在派生类中省略了throws
异常,则可以调用派生类的方法而不必捕获该异常。
您确保EmptyStringGenerator
的子类也不会引发异常。否则,对于编译器将无法确定方法调用是否会导致代码必须处理的已检查异常。在这种情况下,throws
根本没有任何意义。