try catch中存在return的情况

286 阅读2分钟

之前并无过多使用以及debug过return的返回情况,最近了解了一下,并做一下记录。
在try catch中存在return的情况:
代码清单如下:


public Integer add(Integer a,Integer b){
    try{
        return a+b;   
    }catch(NonePointerException e){
        System.out.println(e);
    }finally{
        System.out.println("执行finally语句块"); 
    }
}
public static void main(String[] args){
   System.out.println("最后的和为:"+add(3,3)); 
}

最后输入的结果是:
执行finnally语句块 最后的和为
原因:根据编译的规则,System.out.println()会首先执行add()表达式以及与“最后的和是”这个字符串拼接完成后才会进行输出此语句。 若在try中存在return语句块,此时会首先执行return中的表达式,相加和为6,try中执行return语句并不会真正的return,而是先计算return中的表达式结果,然后将此结果保存在一个临时栈内存中,保存完后回去执行finally中的方法,最后才会从临时栈中取出结果进行返回。PS:至于catch中有return或者finally中有return情况:若finally中有return,则永远以finally中的return返回值为主,否则返回try中的或者catch中的return。

在讨论一种特殊情况:

public Integer add(Integer a,Integer b){
Example exa = new Example();
    try{
        exa.num = a+b;
        return exa.num;
    }catch(NonePointerException e){
        e.printStackTrace();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        System.out.println("执行finally语句块");
        exa.num = 20;
    }
    return exa.num;
}
public static void main(String[] args){
   System.out.println("最后的和为:"+add(3,3)); 
}
public class Example{
    private  Integer num = 100;
}

最后结果为: 最后的和为:20.这就和引用传递的实现类似。
return的返回值为基本数据类型或者字符串(值传递)时,若在try中执行了方法并且存储在临时栈中,则finaly中执行非return方法并且给try中某一变量重新赋值时,此时finally中执行的赋值语句不会对临时栈中存储的值产生影响,也就是返回值不变。若return的返回值为引用数据类型时,此时finally中执行的对引用变量的赋值会影响return中的返回值。