Java 例外规范

Java 例外规范,java,exception,Java,Exception,异常规范是方法签名的一部分吗? 我的意思是: public void someMethod(String myString) throws IOException “抛出IOException”是此方法签名的一部分吗 谢谢否。发件人: 两个方法具有相同的签名,如果 它们有相同的名称和参数 类型 两个方法或构造函数声明 M和N具有相同的参数类型 如果满足以下所有条件: 持有: 他们有相同数量的正式员工 参数(可能为零) 相同数量的类型参数 (可能为零)让它成为 M和let的形式型参数 正式型 N

异常规范是方法签名的一部分吗? 我的意思是:

public void someMethod(String myString) throws IOException
“抛出IOException”是此方法签名的一部分吗

谢谢

否。发件人:

两个方法具有相同的签名,如果 它们有相同的名称和参数 类型

两个方法或构造函数声明 M和N具有相同的参数类型 如果满足以下所有条件: 持有:

他们有相同数量的正式员工 参数(可能为零) 相同数量的类型参数 (可能为零)让它成为 M和let的形式型参数 正式型 N.的参数。重命名每个参数后 在N型到Ai型中出现Bi 对应类型的界 变量与M的参数类型 和N是一样的

因此,两个具有相同名称和参数但声明的异常不同的方法具有相同的签名

此外,来自:

定义:一个组件的两个组件 方法声明包含该方法 签名方法的名称和 参数类型

没有提到例外情况

编辑:对于重写方法(或实现接口),从:

方法声明不能具有 有冲突的条款(§8.4.6) 用它所使用的任何方法 覆盖或隐藏;否则,一个 发生编译时错误

跟进和回应评论


@Jon Skeet为什么我不能让public void run()在实现Runnable的类中抛出IOException认识我认识你

Java语言规范(第三版)第8.4.6节规定:

重写或隐藏另一个方法(第8.4.8节)的方法,包括实现接口中定义的
抽象
方法的方法,不能声明为抛出比重写或隐藏方法更多的检查异常

更准确地说,假设B是一个类或接口,a是B的超类或超接口,B中的方法声明n覆盖或隐藏a中的方法声明m。如果n有一个
throws
子句提到任何选中的异常类型,那么m必须有一个
throws
子句,对于n的
throws
子句中列出的每个选中的异常类型,相同的异常类或其超类型之一必须在m的
throws
子句的擦除中出现;否则,将发生编译时错误


这里不是方法签名的问题,而是不要求调用者解释不需要他们调用的“原始”方法检查的异常。

@Jon Skeet为什么我不能运行public void()在实现Runnable的类中抛出IOException?Jon是对的:),但作者可能需要注意一些事情。您可以声明您的方法引发的异常在异常继承人中的级别低于在接口/超类方法中声明的异常,并且它仍然是该方法的有效实现/重写。@了解我了解您:因为实现接口或重写方法所做的不只是匹配签名。它还必须避免声明它将抛出比已声明的任何更多的已检查异常。啊,异常构成合同的一部分,实现void run()抛出异常所需的接口Runnable将违反此合同。如果合同无效,run()抛出异常;那么您的实现就可以了。