为什么java允许总是抛出异常的方法将返回类型声明为该异常?

为什么java允许总是抛出异常的方法将返回类型声明为该异常?,java,exception,Java,Exception,为什么java允许总是抛出异常的方法将返回类型声明为该异常? 以下两种方法均有效:- public RuntimeException alwaysFails() { throw new RuntimeException("failed"); } public void alwaysFailsButVoid() { throw new RuntimeException("failed"); } 允许这样做有什么好处?返回和抛出不是一回事,它们是独立的。您可以将任何类型声明为方法

为什么java允许总是抛出异常的方法将返回类型声明为该异常? 以下两种方法均有效:-

public RuntimeException alwaysFails() {
    throw new RuntimeException("failed");
}

public void alwaysFailsButVoid() {
    throw new RuntimeException("failed");
}

允许这样做有什么好处?

返回和抛出不是一回事,它们是独立的。

您可以将任何类型声明为方法的返回类型。由于该方法永远不会正常返回,因此这是完全正确的(但具有误导性)

请注意,Java编译器通常无法确定方法何时可以正常返回(因为停止问题无法解决)


允许这样做的好处是允许您对类进行子类化或继承已经为该方法预先指定了返回类型的接口。这对于面向对象编程来说是必不可少的。

我没有看到这个问题。在返回类型和可能的异常之间没有编译时交叉检查。没有关系。编译器只检查哪些被检查的异常是可能的,哪些异常是针对异常声明的(显然,编译器做的远远不止这些)

是的,但我不明白它是如何回答这个问题的(第一个例子)。因此,如果我答对了-更好的方法是在方法签名中使用泛型,比如:
public E alwaysFails()
?这将非常灵活,但这似乎是一件奇怪的事情。LOL编写
alwaysFails())
一开始似乎有些奇怪,但我相信在某些地方会有人找到一个很好的用法…alwaysFails()只是为了举例说明。但番石榴酱就是用这个。请看一下
Throwables#propagate()
的实现。这是我提问的导火索。我对@RobinGreen提供的论点感到满意