首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

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

  •  
  •   kumobot · 2016-08-30 17:37:03 +08:00 · 3164 次点击
    这是一个创建于 1193 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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());
        }
    }
    
    
    28 回复  |  直到 2016-09-04 13:23:05 +08:00
        1
    knightdf   2016-08-30 17:49:41 +08:00
    抛出 finally 里的异常呗
        2
    kumobot   2016-08-30 17:52:32 +08:00
    @knightdf 为什么呢
        3
    lixia625   2016-08-30 17:56:16 +08:00
    @kumobot
    因为执行到了抛出异常那一行 然后就抛出异常。 -_-!
        4
    knightdf   2016-08-30 18:00:44 +08:00
    @kumobot 因为 finally 里就是一正常语句啊。。你还可以在 finally 里再 try catch 呢 - -
        5
    YORYOR   2016-08-30 18:04:56 +08:00
    finally 里面的异常没有被捕获,直接抛异常 REB 了
        6
    xjp   2016-08-30 18:44:35 +08:00
    抛出 REB
        8
    yangff   2016-08-30 19:15:02 +08:00
    编译失败……?
        9
    yangff   2016-08-30 19:16:34 +08:00
    哦不会
        10
    xuhaoyangx   2016-08-30 19:46:56 +08:00
    第一次抛出异常,因为没有相关 catch ,会直接自行 finally 的内容,然后就是抛出 REB 。结果 REB
        11
    dtfm   2016-08-30 19:50:49 +08:00
    我感觉这道题是不是出题人弄错了,我见过很多相似的题目,但考点都是考察 finaly 和 try catch 优先级的
        12
    clearbug   2016-08-30 20:22:57 +08:00
    是啊,这题没有什么疑问呀。。初学 Java 的都能看懂要抛出 REB 了。 IDEA 亲测也是如此
        13
    kyzylsy   2016-08-30 20:23:46 +08:00
    无事水😪
        14
    fireking   2016-08-30 20:34:23 +08:00
    抛出 REB
        15
    depress   2016-08-30 20:36:34 +08:00 via Android
    这道题的考察点分明是最后打印的是 1 还是 2 ,楼上都在干什么。。。
        16
    depress   2016-08-30 20:47:14 +08:00 via Android
    @depress 。。。那个啥,抛异常想成 print 了,我上边啥也没说。。。
        17
    kingoldlucky   2016-08-30 21:31:24 +08:00
    REB
        18
    q397064399   2016-08-30 21:37:05 +08:00
    REB 无疑,
    try 语句执行后,无论什么情况, finally 语句都要被执行,但是 finally 抛出异常后,整个程序就 REB ,因为没有其它程序路径了
        19
    kumobot   2016-08-30 22:12:17 +08:00
    @q397064399 为什么没有打印出 REA 的异常信息呢
        20
    q397064399   2016-08-30 22:30:52 +08:00
    @kumobot 没有说不打印 REA 作为 try 语句,有异常肯定会抛出 抛出之后呢?
    finally 总是要被执行的就是了
        21
    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());
    }
    }
        22
    msg7086   2016-08-30 22:49:01 +08:00
    finally 抢抛了。
    正常的执行流程是

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

    然而 finally 里抛了异常,就变成了
    REA 发生 -> finally -> REB 发生 -> 向上传递 REB 了。
        23
    dawnLuke   2016-08-30 23:04:17 +08:00
    @8bit 原题也太简单了,你这个稍微迷惑一点了
        24
    XhstormR   2016-08-30 23:07:06 +08:00   ♥ 1
    @8bit 排版确实很迷惑!
        25
    colatin   2016-08-31 00:19:58 +08:00
    这种问题都值得讨论,看来 java 在 v2 不受待见啊
        26
    8bit   2016-08-31 10:25:36 +08:00
    @XhstormR 回复的时候不会用 md ,(逃
        27
    paragon   2016-09-02 17:36:46 +08:00
    这就考察递归的功力了~
        28
    MntCw   2016-09-04 13:23:05 +08:00
    楼上这么多位都是真的懂了吗?
    楼主看 @zts1993 回复的内容,非常详细。
    @msg7086 说得也是正确的
    两个异常都发生了,但是 ERA 被忽略了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2402 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 33ms · UTC 07:09 · PVG 15:09 · LAX 23:09 · JFK 02:09
    ♥ Do have faith in what you're doing.