最终吞噬了例外

fic*_*ion 8 java exception

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的一个朋友是.NET开发人员,目前正在迁移到Java,他问我关于这个来源的以下问题.理论上,这必须throw IOException("Exception rised.")和整个方法retIntExc()必须throws Exception.但没有任何反应,该方法返回2.

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

编辑:谢谢你的所有答案.有些人忽略了调用方法的事实retIntExc,这意味着这只是一些测试/实验示例,显示了抛出/捕捉机制中的问题.我不需要'修复',我需要解释为什么会这样.

Jon*_*eet 17

这就是你无法从C#中的finally块返回的原因:)

这绝对是Java语言规范中规定的行为.它在14.20.2节中规定.

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

回归是突然完成的一个例子; 如果finally块抛出异常,那么也会突然完成,丢失原始异常.

上面的引用来自这套嵌套的项目符号,省略了这里不适用的选项:

  • 如果try块的执行由于抛出值V而突然完成,那么有一个选择:
    • 如果V的运行时类型不能分配给try语句的任何catch子句的参数,则执行finally块.然后有一个选择:
      • 如果finally块由于原因S而突然完成,则try语句突然完成,原因是S(并且丢弃并抛弃了值V的抛出).

  • 谢谢.这就是我需要的 - JLS参考. (2认同)