kumobot
V2EX  ›  Java

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

  •  
  •   kumobot · Aug 30, 2016 · 5633 views
    This topic created in 3716 days ago, the information mentioned may be changed or developed.

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

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

    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
    msg7086
    Aug 30, 2016
    22
    finally 抢抛了。
    正常的执行流程是

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

    然而 finally 里抛了异常,就变成了
    REA 发生 -> finally -> REB 发生 -> 向上传递 REB 了。
    dawnLuke
    dawnLuke
    Aug 30, 2016
    23
    @8bit 原题也太简单了,你这个稍微迷惑一点了
    XhstormR
    XhstormR
    Aug 30, 2016❤️1
    24
    @8bit 排版确实很迷惑!
    colatin
    colatin
    Aug 31, 2016
    25
    这种问题都值得讨论,看来 java 在 v2 不受待见啊
    8bit
    8bit
    Aug 31, 2016
    26
    @XhstormR 回复的时候不会用 md ,(逃
    paragon
    paragon
    Sep 2, 2016
    27
    这就考察递归的功力了~
    MntCw
    MntCw
    Sep 4, 2016
    28
    楼上这么多位都是真的懂了吗?
    楼主看 @zts1993 回复的内容,非常详细。
    @msg7086 说得也是正确的
    两个异常都发生了,但是 ERA 被忽略了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1268 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 116ms · UTC 21:42 · PVG 05:42 · LAX 13:42 · JFK 16:42
    ♥ Do have faith in what you're doing.