浅谈try-catch-finally

一、执行顺序

仅仅在下面4种情况下不会执行finally语句:

  1. 若在try或catch语句中执行了System.exit(0)
  2. 在执行finally之前jvm崩溃了
  3. try语句中执行了死循环
  4. 电源断电

除以上情况,finally语句都会执行。

二、执行原则

  1. 不管有没有出现异常,finally中代码都会执行。若无异常,顺序为:try-finally
  2. 当try和catch中有return语句时,finally语句仍会执行
    注意:当finally里没有return语句时,执行try和finally语句之后,最后在执行return
public static int demo2() {
        try {
            return 0;
        }
        finally {
            System.out.println("finally trumps return.");
        }
    }
//输出结果

finally trumps return.
0

  1. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
public static int demo3()
    {
         int i = 0;
            try {
                i = 2;
                return i;
            } finally {
                i = 12;
                System.out.println("finally trumps return.");
            }       
    }
//输出结果
    finally trumps return.
    2

此处中finally中对i赋值12但是demo3的返回值仍然是2,也就是在finally中对i赋值并未改变i的返回值

  1. finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
public static int demo4() {
        int i = 0;
        try {
            return i;
        } finally {
            i = 12;
            System.out.println("finally trumps return.");
            return i;
        }
    }
    //输出结果
    finally trumps return.
    12  

上面为什么会返回12呢?因为在程序还未执行try中的return语句时就先执行了finally里面的return语句

三、常见笔试题

1、输出结果是?

public static int demo5() {
        try {
            return printX();
        }
        finally {
            System.out.println("finally trumps return... sort of");
        }
    }
    public static int printX() {

        System.out.println("X");
        return 0;
    }
//输出结果
X
finally trumps return... sort of
0

原因如下:程序顺序执行时先执行printX()函数,此时得到返回值0并且将0保存到variable中对应的用于保存返回值的区域,此时程序在执行finally语句因为finally语句中没有return语句,所以程序将返回值区域的0返回给上一级函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值