尝试/最后没有捕获和返回值

这个问题在这里已经有了答案:

  • 最终总是在Java中执行? 50个答案

  • 来自JLS(强调我的):

    如果try块的执行由于抛出一个值V而突然完成,那么有一个选择:
    [...]
    如果V的运行时类型不是与try语句的任何catch子句的可捕获异常类分配兼容的,则执行finally块。 然后有一个选择:

  • 如果finally块正常完成,那么try语句突然完成,因为抛出了值V.

  • 如果因为S原因finally块突然完成,那么try语句因S原因突然完成( 并丢弃并丢弃值V的抛出 )。

  • TL / DR
    这意味着,如果你return的内finally没有抛出异常块,该方法返回。
    / TL / DR

    除了return之外,还有其他可能导致finally块突然完成而忘记异常的状态。 它们在JLS第14.1节中定义。 基本上,它是breakcontinuereturn或异常(抛出或由语句/方法引起)。 完成try/catch/finally块然后完成这个原因。

    try/catch/finally的规范中还有更多的情况,特别是如果没有异常或匹配的catch子句存在。 归结到一点, finally打败catchtry


    当抛出异常时, 它将首先通过finally块。

    如果你的finally块没有返回或抛出任何东西,那么传递原始异常。

    如果你的finally块返回一个值, 那么这个异常就不再传播了。

  • 参考:JLS关于try-finally

  • 最后看看try catch的执行情况。

    从Java语言规范-jls-14.20.2

    如果V的运行时类型不是与try语句的任何catch子句的可捕获异常类分配兼容的,则执行finally块。 然后有一个选择:

    如果finally块正常完成,那么try语句突然完成,因为抛出了值V.

    如果因为S原因finally块突然完成,那么try语句因S原因突然完成( 并丢弃并丢弃值V的抛出 )。

    链接地址: http://www.djcxy.com/p/73693.html

    上一篇: try/finally without catch and return value

    下一篇: java