关于java:try {} finally {}使用返回值构造

try{} finally{} construct with return values

本问题已经有最佳答案,请猛点这里访问。

我想知道为什么Java编译器会接受下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {

    public static void main(String ... args){
        System.out.println("a() =" + a());
    }

    public static String a (){
        try {
            return"a";
        }catch(Throwable t){
        }finally{
            return"b";
        }
    }
}

这可以也不应该奏效。Java规范说明EDCOX1的"0"块将始终被执行,但同时返回值已经被指定。所以要么你不能执行return"b"语句,因为你已经在return"a"退出,这是不正确的。

但是,另一种选择是执行return"b"语句,从而完全忽略return"a"语句…

我会说这两个都是错误的,我希望这不会编译。但是它编译和运行良好。我会把答案留给读者作为一个很好的练习。

基本上,我的问题是:除了做不好的练习之外,这会被认为是Java错误,还是除了混淆之外还有其他的妙用呢?

编辑:

如果问题是一个已经被回答的bug,那么问题就不那么多了,但是它有好的用例吗?


一切都按预期工作,这里没有错误。当您有疑问时,JLS是您的救世主:

JLS-14.20.2.Try Finally和Try Catch Finally的执行:

If execution of the try block completes abruptly for any other
reason R, then the finally block is executed, and then there is a
choice:

  • If the finally block completes normally, then the try statement
    completes abruptly for reason R.

  • If the finally block completes abruptly for reason S, then the try
    statement completes abruptly for reason S (and reason R is
    discarded).

它覆盖try块中的值。

return中的finally丢弃了try子句中可以抛出的所有异常。