Exception规范是否是方法签名的一部分? 我的意思是:
public void someMethod(String myString) throws IOException
是'抛出IOException '这个方法签名的一部分吗?
由于
答案 0 :(得分:6)
跟进Jon Skeet's answer并回复评论
@ Jon Skeet为什么然后我无法使用public void run()在实现Runnable的类中抛出IOException? - 了解我了解你
Java语言规范(第3版)第8.4.6节说:
覆盖或隐藏另一个方法(第8.4.8节)的方法,包括实现接口中定义的
abstract
方法的方法,可能不会被声明为抛出比重写或隐藏方法更多的已检查异常。更确切地说,假设 B 是一个类或接口, A 是 B 的超类或超接口,以及方法声明 B 中的 n 会覆盖或隐藏 A 中的方法声明 m 。如果 n 有
throws
子句提及任何已检查的异常类型,则 m 必须具有throws
子句,并且对于列出的每个已检查的异常类型在 n 的throws
子句中,在删除 m 的throws
子句时,必须出现相同的异常类或其超类型之一;否则,发生编译时错误。
这不是方法签名的问题,而是要求呼叫者不必考虑他们正在调用的“原始”方法检查的异常。
答案 1 :(得分:5)
没有。来自section 8.4.2 of the Java Language Spec:
如果有两种方法具有相同的签名 他们有相同的名称和论点 类型。
两个方法或构造函数声明 M和N具有相同的参数类型 如果满足以下所有条件 持有:
他们的正式号码相同 参数(可能为零)他们有 相同数量的类型参数 (可能为零)让我们成为 M的正式类型参数和let 是正式的 参数N.重命名后 N的类型的Bi出现在Ai上 相应类型的界限 变量和M的参数类型 和N是一样的。
所以两个方法具有相同的名称和参数,但声明的异常不同,它们具有相同的签名。
此外,来自the document Bozho quotes:
定义:a的两个组成部分 方法声明包含方法 签名 - 方法的名称和 参数类型。
没有提到那里的例外......
编辑:至于重写方法(或实现接口),来自section 8.4.8.3:
方法声明必须没有 抛出冲突的条款(§8.4.6) 用它的任何方法 覆盖或隐藏;否则,a 发生编译时错误。