首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常被finally吞噬

异常被finally吞噬
EN

Stack Overflow用户
提问于 2011-01-17 15:56:05
回答 7查看 4.3K关注 0票数 8
代码语言:javascript
复制
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的事实,这意味着这只是一些测试/实验示例,显示了抛出/捕获机制中的问题。我不需要“修复”,我需要的是解释为什么会发生这种情况。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-01-17 16:02:30

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

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

如果

块由于原因S而突然完成,那么try语句由于原因S而突然完成(并且丢弃并忘记值V的抛出)。

返回是突然完成的一个例子;如果finally块抛出异常,也会突然完成,丢失原来的异常。

上面的引述来自这组嵌套的要点,省略了这里不适用的选项:

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

票数 18
EN

Stack Overflow用户

发布于 2011-01-17 15:58:32

它将返回2,因为

finally 始终执行

票数 3
EN

Stack Overflow用户

发布于 2011-01-17 16:01:35

无论抛出什么异常,finally块都会执行。它不只是在异常被您声明的catch块捕获之后执行。它在try块之后执行,并捕获异常(如果有)。如果你的方法抛出一个异常,它不能返回任何东西,除非你在你的方法中把它吞下并返回result。但你不能两者兼得。

此外,除非您的方法有任何其他代码,否则也永远不会遇到ArrayIndexOutOfBoundsException

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4711064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档