小编典典

终于吞下了例外

java

static int retIntExc() throws Exception{
    int result = 1;
    try {
        result = 2;
        throw new IOException("Exception rised.");
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println(e.getMessage());
        result = 3;
    } finally {
        return result;
    }
}

我的一个朋友是.NET开发人员,目前正在迁移到Java,他问我有关此资源的以下问题。从理论上讲,这必须throw IOException("Exception rised.")以及整个方法retIntExc()必须throws Exception。但是什么也没发生,该方法返回2。

我没有测试过他的例子,但是我认为这不是预期的行为。

编辑:感谢您的所有答案。你们中的有些人忽略了方法被称为的事实retIntExc,这意味着这只是一些测试/实验示例,显示了投掷/接球机制中的问题。我不需要“修复”,我需要解释为什么会发生这种情况。


阅读 211

收藏
2020-10-09

共1个答案

小编典典

这就是为什么您不能从C#中的finally块返回的原因:)

不过,这绝对是Java语言规范中列出的行为。它在14.20.2节中指定

如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且值V的抛出被丢弃并忘记了)。

返回是突然完成的一个例子。如果该finally块引发异常,那么该异常 也会 突然完成,从而丢失原始异常。

上面的引文来自这组嵌套的项目符号点,省略了此处不适用的选项:

  • 如果由于抛出值V而使try块的执行突然完成,则可以选择:
    • 如果不能将V的运行时类型分配给try语句的任何catch子句的参数,则将执行finally块。然后有一个选择:
    • 如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且值V的抛出被丢弃并忘记了)。
2020-10-09