- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下接口(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/
我一直认为“throw”和“throw ex”的区别was that throw alone wasn't resetting the stacktrace of the exception. 不幸的
我需要处理这样的api错误代码,并为某些状态代码抛出错误。但是遵循代码显示了以上错误。我怎样才能做到这一点? func login(data: [String: Any], completion: @
我见过在 JavaScript 中抛出错误的 3 种不同方式: throw 'message'; throw Error('message'); throw new Error('message');
这个问题在这里已经有了答案: Exception handling : throw, throws and Throwable (8 个答案) 关闭 10 年前。 谁能简单介绍一下Java异常处理中
这是我的代码: func loadData() { ref.child(currentUserID!).observe(.childAdded) { (snapshot) in
可能很明显,但是我仍然无法理解throw和rethrow之间的区别,什么时候应该使用它们中的任何一个? 最佳答案 根据Effective Dart: If you decide to rethrow
这个问题在这里已经有了答案: "new" keyword in Scala (3 个答案) 关闭 5 年前。 在 Scala 中进行一些函数式编程,并且来自 Java 背景,我倾向于像这样抛出异常:
我有一个验证输入字符串的代码,如果输入字符串与所需的格式不匹配,我需要抛出 IllegalArgumentException,有多个字段,每个字段都有一组不同的验证条件,因此对于当前我正在执行的每个字
我的方法有一个抛出 NullPointerException 的返回类型。 public class Student { public String studentOne() {
有些帖子询问这两者之间的区别。 (为什么我要提这个...) 但我的问题在某种程度上有所不同,我在另一个错误神级处理方法中调用了“throw ex”。 public class Program {
谁能解释一下 throw、throws 和 Throwable 之间的区别以及何时使用哪个? 最佳答案 throws :在编写方法时使用,声明有问题的方法抛出了指定的(检查的)异常。 与检查的异常相反
我想知道编写异常收件箱和发件箱是否会改变特定程序的行为,例如 抛出 MyException(); 和 抛出(我的异常()); 我的代码: #include #include using names
抛出异常时,保留堆栈跟踪是最常见的期望行为,在 Java 中,这可以通过 throw ex; 获得,但在 C# 中,throw; 必须使用。 (另请注意,许多 C# 程序员经常错误地使用 throw
这个问题在这里已经有了答案: Exception handling : throw, throws and Throwable (8 个答案) 关闭 8 年前。 谁能举个例子说清楚Java异常处理中
这两个有什么区别吗? 最佳答案 异常是针对程序逻辑中的错误。 JVM 使用错误来表示环境有问题,例如 OutOfMemoryError 或 IncompatibleClassChangeError。
我试图到处寻找这个问题的答案,但似乎我运气不好。 我有一个非常简单的 Mongoose 模型 var userObject = { profile: { username: {
我遇到了这个重新抛出的异常,我很惊讶它甚至可以编译。 } catch(SomeException e) { ... throw(e); } 这个throw()和平时用的有什么区别吗?.
想象两段相似的代码: try { [...] } catch (myErr &err) { err.append("More info added to error..."); throw
我试图弄清楚Java中方法签名中的抛出和抛出语句之间的区别。方法签名中的抛出如下: public void aMethod() throws IOException{ FileReader f
这个问题在这里已经有了答案: throw Error('msg') vs throw new Error('msg') (2 个回答) 24 天前关闭。 没有 new 时抛出错误有什么缺点吗?关键词?
我是一名优秀的程序员,十分优秀!