一道关于 finally 子句的 Java 面试题目

2016-08-30 17:37:03 +08:00
 kumobot

看代码说结果并简述理由:

public class Main {
    public static int testFinally() {
        int a = 1;
        try {
            if (a == 1) {
                throw new RuntimeException("REA");
            }
        } finally {
            if (a == 1) {
                throw new RuntimeException("REB");
            }
            a = 2;
        }
        return a;
    }
    public static void main (String args[]) {
        System.out.println(testFinally());
    }
}

4395 次点击
所在节点    Java
28 条回复
8bit
2016-08-30 22:34:39 +08:00
这样考才是真有点迷惑性

public class Main {
public static int testFinally() {
int a = 1;
try {
if (a == 1) {
throw new RuntimeException("REA");
}

a = 2;
return a;

} finally {
if (a == 1) {
throw new RuntimeException("REB");
}
}
}
public static void main (String args[]) {
System.out.println(testFinally());
}
}
msg7086
2016-08-30 22:49:01 +08:00
finally 抢抛了。
正常的执行流程是

异常发生 -> finally -> 向上传递异常

然而 finally 里抛了异常,就变成了
REA 发生 -> finally -> REB 发生 -> 向上传递 REB 了。
dawnLuke
2016-08-30 23:04:17 +08:00
@8bit 原题也太简单了,你这个稍微迷惑一点了
XhstormR
2016-08-30 23:07:06 +08:00
@8bit 排版确实很迷惑!
colatin
2016-08-31 00:19:58 +08:00
这种问题都值得讨论,看来 java 在 v2 不受待见啊
8bit
2016-08-31 10:25:36 +08:00
@XhstormR 回复的时候不会用 md ,(逃
paragon
2016-09-02 17:36:46 +08:00
这就考察递归的功力了~
MntCw
2016-09-04 13:23:05 +08:00
楼上这么多位都是真的懂了吗?
楼主看 @zts1993 回复的内容,非常详细。
@msg7086 说得也是正确的
两个异常都发生了,但是 ERA 被忽略了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/302726

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX