gpt4 book ai didi

java - 在派生类中省略 throws 声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:15 24 4
gpt4 key购买 nike

考虑以下接口(interface):

public interface Generator {
String generate() throws IOException;
}

和以下实现:

public class EmptyStringGenerator implements Generator {
@Override
public String generate() {
return "";
}
}

请注意,我省略了 Generator 接口(interface)中指定的签名的 throws IOException 部分。然而,没有编译器错误,没有编译器警告,甚至 @Override 注释也没有提示。

我知道这是按预期工作的。但是,我想知道这背后的意图。如果我的方法实际上没有抛出 IOException,那么不抛出它就可以了,我不必将其从签名中删除。但是,如果我确实将它从 EmptyStringGenerator 中的方法签名中删除,我将强制该类的所有当前和 future 子类放弃抛出接口(interface)中实际指定的异常的可能性。

在我看来,这听起来像是一个不会真正给您带来任何好处的功能(除了节省几次击键之外,这根本算不上什么好处),但有可能成为一个可怕的错误,当实际使用。

所以我的问题实际上是:在派生类中省略 throws 异常有什么意义?这种可能性解决的问题是什么?为什么允许这样做?

更新

对于问“但是这样做的危害在哪里?”的人,这里是我的一个评论中的示例。顺便说一句,这并不牵强,因为这正是我现在正在处理的问题:

程序员A指定了接口(interface)I,程序员B写了实现类X,但是忘记加上throws。他也从来没有注意到,因为这里甚至没有发出警告。程序员C写了Y类的实现,继承自X类,他还特意把throws放在那里,因为他要throw。但是虽然界面上有规定,但是现在因为B的疏忽,他不能再这样做了。实际上,他不再被允许在这里使用该异常(exception)。这是一个相当大的伤害。特别是如果 X 类不受您的控制。

最佳答案

如果在派生类中省略throws 异常,则可以调用派生类的方法而不必捕获异常。

确保 EmptyStringGenerator 的子类也不会抛出异常。否则编译器无法确定方法调用是否会导致代码必须处理的已检查异常。在那种情况下,throws 根本没有意义。

关于java - 在派生类中省略 throws 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com