Java中 return 和finally

1. 最简单的情形

    public void main(){
        String s = test();
        System.out.println("s=[" + s + "]");
    }
    
    public String test(){
        String s = "";
        try{
            System.out.println("In try");
            s += "try," ;
        }catch(Exception ex){
            System.out.println("In catch");
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }

输出的结果是:

In try
In finally
s=[try,finally,other]

2. 在try中加上return,那么结果是

    public String test(){
        String s = "";
        try{
            System.out.println("In try");
            s += "try," ;
            return s; //加上return
        }catch(Exception ex){
            System.out.println("In catch");
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }

结果是

In try
In finally
s=[try,]

说明虽然会执行finally语句,但是return的结果已经准备好了。然后才执行finally,在执行finally之前,会将返回的结果存储到不同于s的变量中,finally执行成功之后,才会返回对应的结果。因此即使在finally中对结果进行修改,也不会修改返回的结果。

3. 如果在catch中return会怎么样呢?

    public String test(){
        String s = "";
        try{
            System.out.println("In try");
            s += "try," ;
            throwException();
        }catch(NullPointerException ex){
            System.out.println("In catch");
            s += "catch,";
            return s;
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }
    
    public void throwException() throws NullPointerException{
        throw new NullPointerException();
    }

执行结果是:

In try
In catch
In finally
s=[try,catch,]

可见道理是一样的,也就是不管在try还是在catch中的语句中return的结果,即使在finally中进行修改,都不会改变结果。

4. return 语句先执行,还是finally先执行呢?

    public String test(){
        String s = "";
        try{
            
            System.out.println("In try");
            s += "try," ;
            throwException();
        }catch(NullPointerException ex){
            System.out.println("In catch");
            s += "catch,";
            return s += testReturn();
        }finally{
            s += "finally,";
            System.out.println("In finally");
        }
        s+="other";
        return s;
    }
    
    public String testReturn(){
        System.out.println("In Return");
        return "return,";
    }
    
    public void throwException() throws NullPointerException{
        throw new NullPointerException();
    }

结果是:

In try
In catch
In Return
In finally
s=[try,catch,return,]

也就是,return还是要比finally先执行,但是这时函数还没急着返回,只有把finally执行完才会返回。

总结的结果是: 

1. 不管是否有异常,finally都会执行

2. 即使try或catch中有return语句,finally仍然会执行

3. finally中语句是在return语句之前执行的,即return语句执行就决定了返回的结果

4. return语句执行完如果还有finally块,还会执行finally块,但是无法修改return语句返回的结果

参考资料:

http://www.cnblogs.com/ybwang/archive/2010/10/10/1847269.html

原文地址:https://www.cnblogs.com/longshaohang/p/3748076.html