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的抛出).
| 归档时间: |
|
| 查看次数: |
3505 次 |
| 最近记录: |