c++ try catch语句_你真的理解 Java 中的 try_catch_finally 吗?

v2-0b772509f6c893c321ada15fed8d0021_1440w.jpg?source=172ae18b

try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?

看几个例子,回顾一下执行顺序

例子 1 无异常,finally 中的 return 会导致提前返回

public 

调用 test() 的结果:

try

例子 2 无异常,try 中的 return 会导致提前返回

public 

调用 test() 的结果:

try

例子 3 有异常,finally 中的 return 会导致提前返回

public 

调用 test() 的结果:

try

例子 4 有异常,catch 中的 return 会导致提前返回

public 

调用 test() 的结果:

try

例子 4 有异常,不会提前返回

public 

调用 test() 的结果:

try

小结

上面这几个例子,大多数人已经非常了解。同时也衍生出一些理论,比如不要在 finally 中 return 等,不再赘述。

再看几个例子,返回值是否符合你的预期?


例子 1

public 

返回值:2

说明:与我们上面的例子一致,finally 中的 return 导致提前返回,try 中的 return1 不会被执行。

附编译后的代码:

public 

可以看到编译器做过优化,同时验证了 boolean 类型在底层是用 int 实现的,但注意你在源码中直接给 int 行赋值 true 或 false 是不被允许的。

例子 2

public 

返回值:5

说明:执行 try 中的代码后,再执行 finally 中的代码,最终 i 被赋值为 5,最后返回

附编译后的代码:

public 

同样可以看出,编译器做了一些优化。

例子 3

public 

返回值:3

这个例子稍微有点意思,按我们通常的思维,应该还是返回 5,毕竟 finally 中把 i 赋值为 5 了嘛,然后由 try 中的 return 返回。然而很不幸,返回值是 3。

为什么呢?先看一下编译后的代码:

public 

我们会发现,finally 中的代码块不起作用。不知你是否想起一点:Java 中是按值传递的,finally 中的 i 只是一个局部变量,finally 块执行完毕后,局部变量便不复存在。

接着看例子:

例子 4

public 

返回:包含 1 和 2 两个元素的 List 对象。

说明:这个例子中,基本类型 int 被替换为引用类型 List,虽然 list 是按值传递,但它内部的状态可变(体现在这里,就是可以 add 元素)。扩展:finally 只能保证对象本身不可变,但无法保证对象内部状态不可变。

附编译后的代码:

public 

你现在应该觉得自己理解了,那么再来看两个例子:

例子 5

public 

该函数没有返回值。原因:jvm 提前退出了。

附编译后的代码:

public 

例子 6

public 

由于 try 中的无限循环阻塞,永远执行不到 finally 中的代码块。

附编译后的代码:

public 

小结

为了方便说明,只举了 finally 代码块的例子,catch 代码块是类似的。

总结

执行顺序:

  1. try 代码块中 return 前面的部分   
  2. catch 代码块中 return 前面的部分   
  3. finally 代码块中 return 前面的部分   
  4. finally 的 return 或 catch 的 return 或 try 的 return。若前面的 return 被执行,会导致提前返回,同时后面的 return 被忽略。   
  5. 方法的其他部分

变量:

  注意 Java 的按值传递规则

特殊情况:

  注意 finally 不会被执行的情况  

“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!

作者:xiaoxi666
链接: https://www. cnblogs.com/xiaoxi666/p /10954787.html
来源:博客园
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值