先看两端代码,猜测一下结果

代码一:

public static int test1() {int x = 1;try {return x;} finally {x = 2;}
}

代码二:

public static int test2() {int x = 1;try {return x;} finally {x = 2;return x;}
}

结果是,代码一返回的是1,代码二返回的是2

原因:有一个 临时存储变量

  • 在try中return的话,会吧return的值存储进临时存储变量中,然后在执行finally,最后返回的是临时变量的值。。。
  • 但是如果在finally中return的话,那finally的逻辑执行完才会存储进临时存储变量中,最终返回

总结:

  • return的执行优先级高于finally的执行优先级,但是return语句执行完毕之后并不会马上结束函数,而是将结果保存到栈帧中的局部变量表中,然后继续执行finally块中的语句;
  • 如果finally块中包含return语句,则不会对try块中要返回的值进行保护,而是直接跳到finally语句中执行,并最后在finally语句中返回,返回值是在finally块中改变之后的值;

finally中的代码一定会执行,也有例外

在正常情况下,它是一定会被执行的,但是至少存在以下三种情况,是一定不执行的:

try语句没有被执行到就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到;
try代码块中有System.exit(0);这样的语句,因为System.exit(0);是终止JVM的,连JVM都停止了,finally肯定不会被执行了;
守护线程会随着所有非守护线程的退出而退出,当守护线程内部的finally的代码还未被执行到,非守护线程终结或退出时,finally 肯定不会被执行;

try-finally的详解相关推荐

  1. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  2. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  3. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  4. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  5. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  6. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  7. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. pytorch nn.LSTM()参数详解

    输入数据格式: input(seq_len, batch, input_size) h0(num_layers * num_directions, batch, hidden_size) c0(num ...

  10. Java集合详解之Map

    一.首先看看集合框架体系图 从图中可以看到,Map接口扩展了Iterator接口,关于Iterator接口详解请移步:Iterator接口详解 二.Map是什么? Map<k,v>使用键值 ...

最新文章

  1. 数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!
  2. IK分词器使用自定义词库
  3. matlab如何绘制三维隐函数?
  4. 哇靠靠,这也行?零基础DIY无人驾驶小车(三)
  5. Linux链接库三(C跟C++之间动态库的相互调用)
  6. Django请求响应对象
  7. Upload-Labs(11-15)
  8. windosw启动redis
  9. inventor中齿条怎么画_涨知识干货|瀑布怎么画?山水画刀画中的八种分类
  10. 第3章 排列清单控制标记
  11. 在Windows上删除所有的Oracle安装 和电脑名改变后的设置...
  12. 万年历插件软件测试,万年历的程序代码
  13. 100小时学习SAP之自学环境(一)
  14. 【模板】单峰函数求极值
  15. 万字综述自动驾驶数据闭环
  16. Android11.0 默认开启WLAN热点设置默认热点名称和密码
  17. Mac下编译WebRTC(Mac和iOS版本)
  18. android studio记账,Android Studio——记账本以及图表可视化实现
  19. 无法联网的情况下,dbeaver离线安装数据库驱动-clickhouse
  20. BGP协议解析(白话版)

热门文章

  1. react中解决下拉时,多个tooltip包裹的列表中,hover时,tooltip快速触发,闪烁问题
  2. Python正则匹配单引号即‘
  3. c语输入单引号_必须知道的C语言知识细节:单引号和双引号正确用法
  4. 怎么用文本文档写html框架,基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作...
  5. 闲鱼源码搭建+后台管理
  6. 鸿蒙开发 拍照功能,详细解析(Js篇)
  7. ImGui写个登录界面
  8. 搞搞算法 2:面向对象
  9. android7 init,Android7.0 init.rc流程分析
  10. 农药化工企业设备管理制度参考-PreMaint推荐