例外规范

时间:2010-05-07 09:54:50

标签: java exception

Exception规范是否是方法签名的一部分? 我的意思是:

public void someMethod(String myString) throws IOException

是'抛出IOException '这个方法签名的一部分吗?

由于

2 个答案:

答案 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   发生编译时错误。