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

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

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

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

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

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

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