【问题标题】:Why does java allow a method which always throws an exception to declare the return type as that exception?为什么java允许总是抛出异常的方法将返回类型声明为该异常?
【发布时间】:2013-11-07 19:02:53
【问题描述】:

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

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

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

允许这样做有什么好处?

【问题讨论】:

    标签: java exception


    【解决方案1】:

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

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

    允许这样做的好处是允许您子类化一个类或继承一个已经为该方法预先指定了返回类型的接口。这对于面向对象的编程至关重要。

    【讨论】:

    • 所以如果我做对了 - 更好的方法是在方法签名中使用泛型,例如:public <E> E alwaysFails()?
    • 这将非常灵活,但这样做似乎很奇怪。
    • LOL 写alwaysFails() 开始似乎是一件奇怪的事情 - 但我敢肯定有人会在某个地方找到一个很好的用法......
    • alwaysFails() 只是为了说明。但是 Guava Throwables 使用了这个。看Throwables#propagate()的实现。这是我的问题的触发器。我对@RobinGreen 提供的论点感到满意
    【解决方案2】:

    返回和投掷不是一回事,它们是独立的。

    【讨论】:

    • 是的,但我不明白它是如何回答问题的(第一个例子)。
    【解决方案3】:

    我没有看到这个问题。返回类型和可能的异常之间没有编译时交叉检查。没有关系。编译器只检查哪些已检查异常是可能的,以及针对异常声明了哪些异常(显然,编译器在此之外做了更多工作)。

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2011-04-23
      • 2017-03-06
      • 1970-01-01
      相关资源
      最近更新 更多