【发布时间】:2015-10-07 11:34:36
【问题描述】:
为什么throws 在方法上是其签名的一部分?包含它似乎很奇怪。这是一个阻碍的例子:
@Overide
public void foo() {
throw new UnsupportedOperationException();
}
如果有人从外部看到此方法,他们可能会在不知道它不受支持的情况下尝试使用它。他们只会在尝试运行代码时学习它。
但是,如果他们可以做这样的事情,他们会通过查看不受支持的方法知道,如果 UnsupportedOperationException 没有扩展 RuntimeException,他们会收到编译错误。 EDIT1:但这是不可能的,因为throws 是签名的一部分,因此覆盖不起作用。
@Overide
public void foo() throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}
这个问题与 Java 的设计有关,所以我知道如果没有一个从事它工作的人过来回答它,可能很难回答,但我希望这个问题可能以前被问过,或者那个用这种方式解释原因可能有一个明显的理由。
【问题讨论】:
-
您似乎在这里回答了您自己的问题?它在签名上,因为现在您(和编译器)知道代码会抛出异常并且需要处理它?
-
未经检查的异常和它们被抛出的条件应该记录在 javadoc 中。这种范式用于内置 Java 库,并被多本书籍推荐,例如有效的 Java 就是其中之一。正如您正确指出的那样,编译器不需要在签名中声明它们。
-
你要问的是是否抛出未经检查的异常。首先,您的方法使用
@Override,这表明它应该遵循合同(抽象或接口),但对于未经检查的异常,您没有义务这样做。无论您选择抛出它还是不总是遵循@danstahr 提到的良好做法,请将其添加到 javadoc 中。 -
未经检查的异常通常用于几乎无处不在的问题。想想
NullPointerException或ArrayIndexOutOfBoundsException。我不想将它们包含在每个方法签名中。 -
关于声明 RuntimeExceptions 被抛出另见stackoverflow.com/questions/8396329/…
标签: java exception methods method-signature