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的事实,这意味着这只是一些测试/实验示例,显示了抛出/捕获机制中的问题。我不需要“修复”,我需要的是解释为什么会发生这种情况。
发布于 2011-01-17 16:02:30
这就是为什么不能从C#中的finally块返回:)
不过,这绝对是Java语言规范中规定的行为。它在section 14.20.2中指定。
如果
块由于原因S而突然完成,那么try语句由于原因S而突然完成(并且丢弃并忘记值V的抛出)。
返回是突然完成的一个例子;如果finally块抛出异常,也会突然完成,丢失原来的异常。
上面的引述来自这组嵌套的要点,省略了这里不适用的选项:
发布于 2011-01-17 15:58:32
它将返回2,因为
finally 始终执行
发布于 2011-01-17 16:01:35
无论抛出什么异常,finally块都会执行。它不只是在异常被您声明的catch块捕获之后执行。它在try块之后执行,并捕获异常(如果有)。如果你的方法抛出一个异常,它不能返回任何东西,除非你在你的方法中把它吞下并返回result。但你不能两者兼得。
此外,除非您的方法有任何其他代码,否则也永远不会遇到ArrayIndexOutOfBoundsException。
https://stackoverflow.com/questions/4711064
复制相似问题