java finally什么时候执行_java finally执行顺序

class ReturnClass {

public ReturnClass() {

System.out.println("执行了return语句");

}

}public final class test {

// 测试return语句

public ReturnClass testReturn() {

try {

return new ReturnClass();

} catch (Exception e) {

e.printStackTrace();

} finally {

System.out.println("执行了finally语句");

}

return null;

}

//结果

执行了return语句

执行了finally语句// 测试continue语句

public void testContinue() {

for (int i = 0; i < 3; i++) {

try {

System.out.println(i);

if (i == 1) {

continue;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

System.out.println("执行了finally语句");

}

}

}

//结果

0

执行了finally语句

1

执行了finally语句

2

执行了finally语句

// 测试break语句

public void testBreak() {

for (int i = 0; i < 3; i++) {

try {

System.out.println(i);

if (i == 1) {

break;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

System.out.println("执行了finally语句");

}

}

}public static void main(String[] args) {

test ft = new test();

// 测试return语句

// ft.testReturn();

// System.out.println();

// 测试continue语句

// ft.testContinue();

// System.out.println();

// 测试break语句

ft.testBreak();

}

}很明显,return、continue和break都没能阻止finally语句块的执行。

从输出的结果来看,return语句似乎在finally语句块之前执行了,事实真的如此吗?我们来想想看,return语句的作用是什么呢?是退出当前的方法,并将值或对象返回。

如果finally语句块是在return语句之后执行的,那么return语句被执行后就已经退出当前方法了,finally语句块又如何能被执行呢?

因此,正确的执行顺序应该是这样的:编译器在编译return new ReturnClass();时,将它分成了两个步骤,new ReturnClass()和return,前一个创建对象的语句是在finally语句块之前被执行的,而后一个return语句是在finally语句块之后执行的,

也就是说finally语句块是在程序退出方法之前被执行的。同样,finally语句块是在循环被跳过(continue)和中断(break)之前被执行的。

注意:本文归作者所有,未经作者允许,不得转载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值