2020年9月4日 try catch finally遇见return的时候返回值是啥?(面试题)

package com.atguigu.test04;

/*
 * finally与return混用:
 * 
 * (1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。
 *     finally中的代码都必须执行
 * (2)如果finally中有return就从finally块的的return回去 */
public class TestFinallyReturn {
    public static void main(String[] args) {
        String str = getNum(1);
        System.out.println(str);
    }
    
    public static String getNum(int a){
        try{
            System.out.println(a/0);
            if(a > 0){
                return "正数";
            }else if(a < 0){
                return "负数";
            }else{
                return "零";
            }
        }catch(Exception e){
            return "异常";
        }finally{
            return "最终";
        }
    }
}
//运行结果:
最终
package com.atguigu.test04;

/*
 * finally与return混用:
 * 
 * (1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。
 *     finally中的代码都必须执行
 * (2)如果finally中有return,就从finally块的的return回去。
 * 3)如果finally中没有return,那么先把try或catch中该执行的执行完,
 * 在return结束当前方法之前,先走一下finally,然后回去结束当前方法
 */
public class TestFinallyNoReturn {
    public static void main(String[] args) {
        String str = getNum(1);
        System.out.println(str);
    }
    
    public static String getNum(int a){
        try{
            System.out.println(a/0);
            if(a > 0){
                return "正数";
            }else if(a < 0){
                return "负数";
            }else{
                return "零";
            }
        }catch(Exception e){
            System.out.println("exception");//①try、catch中该执行的执行完
            return "异常";//③最后return
        }finally{
            System.out.println("finally");//②除了try、catch中该执行的执行完后,先执行finally
        }
    }
}
//运行结果:
exception
finally
异常
 
package com.atguigu.test04;
/*
 * finally与return混用:
 * 
 * (1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。
 *     finally中的代码都必须执行
 * (2)如果finally中有return,就从finally块的的return回去。
 * (3)如果finally中没有return,那么先把try或catch中该执行的执行完(包括把返回值的结果放到要带回调用处的操作数栈的位置)
 * 在return结束当前方法之前,先走一下finally,然后回去结束当前方法.
 * 结论,如果finally中没有return,finally中的代码不影响返回值。
 */
public class TestFinallyNoReturn2 {
    public static void main(String[] args) {
        int num = getNum(4);
        System.out.println(num);//0
    }
    
    public static int getNum(int a){
        int result = 10;
        try{
            System.out.println(a/0);
            if(a > 0){
                result = 20;
                return result;
            }else if(a < 0){
                result = -20;
                return result;
            }else{
                return result;
            }
        }catch(Exception e){
            System.out.println("exception");
            result = 0;
            return result;
        }finally{
            result = 30;
            System.out.println("finally");
//            return result;//如果有这句,结果就变成30
        }
    }
}

运行结果:
exception//该执行的执行完

finally//除了try、catch之外先执行finally
0//返回值的结果0,(包括把返回值的结果放到要带回调用处的操作数栈的位置
 

 

posted @ 2020-09-04 17:07  窦云鹏  阅读(115)  评论(0编辑  收藏  举报