一道关于 finally 子句的 Java 面试题目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kumobot
V2EX    Java

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

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

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

    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     Solana     3001 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:12 PVG 20:12 LAX 04:12 JFK 07:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86