try catch finally return 轶事

最近阿里发布了java开发手册终极版,看到其中一条规约:【强制】不能在 finally 块中使用 return, finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句。于是在ideal里面实际跑了一下,果然如此。于是好奇编译后的代码是如何的,结果很是惊讶呢,细品还是很有道理的。代码如下:

public int test() {
    try{
        System.out.println("try");
        return 3;
    }catch (Exception e){
        System.out.println("exception");
        return 1;
    }finally{
        System.out.println("finally");
        return 2;
    }
}

运行结果如下:

try
finally
2
的确没有输出try块中的return值,反编译之后代码如下:

public int test() {
    try {
        System.out.println("try");
        boolean var1 = true;
    } catch (Exception var6) {
        System.out.println("exception");
        boolean var2 = true;
    } finally {
        System.out.println("finally");
        return 2;
    }
}
    

对代码稍作改动,去掉finally中的return语句。

public int test() {
    try{
        System.out.println("try");
        return 3;
    }catch (Exception e){
        System.out.println("exception");
        return 1;
    }finally{
        System.out.println("finally");
        //return 2;
    }
}

运行结果如下:

try
finally
3
反编译之后的代码如下:

public int test() {
    byte var2;
    try {
        System.out.println("try");
        byte var1 = 3;
        return var1;
    } catch (Exception var6) {
        System.out.println("exception");
        var2 = 1;
    } finally {
        System.out.println("finally");
    }
    return var2;
}

posted on 2017-09-29 09:26  robertsun  阅读(102)  评论(0编辑  收藏  举报

导航