try/catch/finally的惊人输出?

Tah*_*idi 6 java try-catch

我运行这段代码:

public static void main(String[] args) {
    System.out.println(catcher());
}

private static int catcher() {
    try {
        System.out.println("TRY");
        thrower();
        return 1;
    } catch (Exception e) {
        System.out.println("CATCH");
        return 2;
    } finally {
        System.out.println("FINALLY");
        return 3;
    }
}

private static void thrower() {
    throw new RuntimeException();
}
Run Code Online (Sandbox Code Playgroud)

我希望在输出中看到这个:

TRY
CATCH
FINALLY
2
Run Code Online (Sandbox Code Playgroud)

但令人惊讶的是输出是:

TRY
CATCH
FINALLY
3
Run Code Online (Sandbox Code Playgroud)

我糊涂了.return 2声明在哪里?这是return at finally一种不好的做法吗?

ste*_*fen 1

在 JSE7 语言规范\xc2\xa714.1中,语句return被定义为突然终止。如果您的finally块突然完成(您的return),try块会因相同的原因结束(如\xc2\xa714.20.2中定义):

\n\n

\xc2\xa714.1 \n [...] 突然完成总是有一个相关的原因,它是以下之一: [...] 没有值的返回 [...] 带有给定值的返回[...]

\n\n

\xc2\xa714.20.2 \n [...] 如果finally 块因原因S 突然完成,则try 语句因原因S 突然完成(并且原因R 被丢弃)。[...](原因 R 是 的结果catch)。

\n