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。
throw IOException("Exception rised.")
retIntExc()
throws Exception
我没有测试过他的例子,但是我认为这不是预期的行为。
编辑:感谢您的所有答案。你们中的有些人忽略了方法被称为的事实retIntExc,这意味着这只是一些测试/实验示例,显示了投掷/接球机制中的问题。我不需要“修复”,我需要解释为什么会发生这种情况。
retIntExc
这就是为什么您不能从C#中的finally块返回的原因:)
不过,这绝对是Java语言规范中列出的行为。它在14.20.2节中指定。
如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且值V的抛出被丢弃并忘记了)。
返回是突然完成的一个例子。如果该finally块引发异常,那么该异常 也会 突然完成,从而丢失原始异常。
finally
上面的引文来自这组嵌套的项目符号点,省略了此处不适用的选项:
如果由于抛出值V而使try块的执行突然完成,则可以选择: 如果不能将V的运行时类型分配给try语句的任何catch子句的参数,则将执行finally块。然后有一个选择: 如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且值V的抛出被丢弃并忘记了)。