try-catch-finally-return的执行顺序和try-with-resource语法糖

try-catch-finally-return的执行顺序

总结如下几条情况

  1. ·try-catch-finally都有return语句时,没有异常时,返回值是finally中的return返回的·。

    • 执行try块,执行到return语句时,先执行return的语句
    • 但是不返回到main方法,执行finally块,遇到finally块中的return语句
    • 并将值返回到main方法,这里就不会再回去返回try块中计算得到的值
    • 所以最终的值是finally的返回
    • 举例如下
      public static void main(String[] args) throws ParseException {int i = NoException();System.out.println("最终值: " + i);
      }public static int NoException() {int i = 10;try {System.out.println("i in try block is:" + i);return --i;} catch (Exception e) {--i;System.out.println("i in catch - form try block is:" + i);return --i;} finally {System.out.println("i in finally - from try or catch block is:" + i);return --i;}
      }
      /*
      i in try block is:10
      i in finally - from try or catch block is:9
      最终值: 8*/
      
  2. try-catch都有return语句时,没有异常时,返回值是try中的return返回的

    • try中执行完return的语句后,不返回,执行finally块
    • finally块执行结束后,返回到try块中
    • 最后,返回在try块中最后的值
    • 举例如下
      public static void main(String[] args) throws ParseException {int i = NoException();System.out.println("最终值: " + i);
      }public static int NoException() {int i=10;try{System.out.println("i in try block is:"+i);return --i;}catch(Exception e){--i;System.out.println("i in catch - form try block is:"+i);return --i;}finally{System.out.println("i in finally - from try or catch block is:"+i);--i;System.out.println("i in finally block is:"+i);//return --i;}
      }
      /*
      i in try block is:10
      i in finally - from try or catch block is:9
      i in finally block is:8
      最终值: 9
      */
      
  3. try块中抛出异常,try、catch和finally中都有return语句,返回值是finally中的return。

    • 抛出异常后,执行catch块,在catch块的return的执行完后
    • 并不直接返回而是执行finally,因finally中有return语句,所以,执行finally里面的语句
    • 最终返回finally的return
    • 举例如下
      public static void main(String[] args) throws ParseException {int i = NoException();System.out.println("最终值: " + i);
      }public static int NoException() {int i = 10;try {System.out.println("i in try block is:" + i);i = i / 0;return --i;} catch (Exception e) {System.out.println("i in catch - form try block is:" + i);--i;System.out.println("i in catch block is:" + i);return --i;} finally {System.out.println("i in finally - from try or catch block is--" + i);--i;System.out.println("i in finally block is--" + i);return --i;}
      }
      /*
      i in try block is:10
      i in catch - form try block is:10
      i in catch block is:9
      i in finally - from try or catch block is--8
      i in finally block is--7
      最终值: 6*/
      
  4. try块中抛出异常,try和catch中都有return语句,返回的catch中return值。

    • 抛出异常后,执行catch块
    • 执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值。
    • 举例如下
      public static void main(String[] args) throws ParseException {int i = NoException();System.out.println("最终值: " + i);
      }public static int NoException() {int i = 10;try {System.out.println("i in try block is:" + i);i = i / 0;return --i;} catch (Exception e) {System.out.println("i in catch - form try block is:" + i);return --i;} finally {System.out.println("i in finally - from try or catch block is:" + i);--i;System.out.println("i in finally block is:" + i);//return i;}
      }
      /*
      i in try block is:10
      i in catch - form try block is:10
      i in finally - from try or catch block is:9
      i in finally block is:8
      最终值: 9
      */
      
  5. try、catch中都出现异常,在finally中有返回,返回finally中return值

    • try块中出现异常到catch,catch中出现异常到finally
    • finally中执行到return语句返回,不检查异常。
    • 举例如下
      public static void main(String[] args) throws ParseException {int i = NoException();System.out.println("最终值: " + i);
      }public static int NoException() {int i = 10;try {System.out.println("i in try block is:" + i);i = i / 0;return --i;} catch (Exception e) {System.out.println("i in catch - form try block is:" + i);int j = i / 0;return --i;} finally {System.out.println("i in finally - from try or catch block is:" + i);--i;System.out.println("i in finally block is:" + i);return --i;}
      }
      /*
      i in try block is:10
      i in catch - form try block is:10
      i in finally - from try or catch block is:10
      i in finally block is:9
      最终值: 8
      */
      

try-with-resource语法糖

JDK7之后,Java多了个新的语法:try-with-resources语句,该语句确保在语句执行完毕后,每个资源都被自动关闭 。

可以理解为是一个声明一个或多个资源的 try语句(用分号隔开),一个资源作为一个对象,并且这个资源必须要在执行完关闭的

其实之前的手动关闭,在这个语法糖里面并没有被取消,而是因为编译器,编译器自动帮我们生成了finally块,并且在里面调用了资源的close方法,所以例子中的close方法会在运行的时候被执行。

原理

传统写法

public void readFile() throws FileNotFoundException {FileReader fr = null;BufferedReader br = null;try{fr = new FileReader("d:/test.txt");br = new BufferedReader(fr);String s = "";while((s = br.readLine()) != null){System.out.println(s);}} catch (IOException e) {e.printStackTrace();}finally {try {br.close();fr.close();} catch (IOException e) {e.printStackTrace();}}
}

使用当前语法

public void readFile() throws FileNotFoundException {try(FileReader fr = new FileReader("d:/test.txt");BufferedReader br = new BufferedReader(fr)){String s = "";while((s = br.readLine()) != null){System.out.println(s);}} catch (IOException e) {e.printStackTrace();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙内核源码分析(时间管理篇) | 谁是内核基本时间单位

时间概念太重要了,在鸿蒙内核又是如何管理和使用时间的呢? 时间管理以系统时钟 g_sysClock 为基础,给应用程序提供所有和时间有关的服务。 用户以秒、毫秒为单位计时.操作系统以Tick为单位计时,这个认识很重要. 每秒的tick大小很大程度上决…

Linux:进程等待 进程替换

Linux:进程等待 & 进程替换 进程等待wait接口statuswaitpid接口 进程替换exec系列接口 当一个进程死亡后,会变成僵尸进程,此时进程的PCB被保留,等待父进程将该PCB回收。那么父进程要如何回收这个僵尸进程的PCB呢?父…

js实现json数据可编辑

背景 项目中有低代码平台,由于历史脏数据和非同步编辑的问题,偶尔会出现数据错乱的问题,希望有一个快捷的方式修改数据 之前在用Formily的时候有注意到designable/react 里面的json数据编辑功能非常不错如果能应用到项目里就完美了 design…

【数据结构】二叉树知识点详解

树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、…

【贪心算法】单源最短路径Python实现

文章目录 [toc]问题描述Dijkstra算法Dijkstra算法的正确性贪心选择性质最优子结构性质 Dijkstra算法应用示例Python实现时间复杂性 问题描述 给定一个带权有向图 G ( V , E ) G (V , E) G(V,E),其中每条边的权是非负实数,给定 V V V中的一个顶点&…

K8S RBAC 鉴权

介绍 K8S(Kubernetes)的RBAC(Role-Based Access Control,基于角色的访问控制)是一种权限控制机制,它允许管理员通过定义角色来限制用户对集群资源的访问权限。RBAC是Kubernetes中一个核心的授权策略&#…

@Valid 和 @Validated 注解使用和区别

概述 这两个注解的作用都是简化 校验 Valid Spring 注解 Maven 依赖 如果是springboot项目&#xff0c;这个依赖存在于web开发包里面&#xff0c;如下 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starte…

【busybox记录】【shell指令】expand

目录 内容来源&#xff1a; 【GUN】【expand】指令介绍 【busybox】【expand】指令介绍 【linux】【expand】指令介绍 使用示例&#xff1a; 把制表符转化为空格 - 默认输出 把制表符转化为空格 - 修改制表符转空格的个数 把制表符转化为空格 - 修改制表符转空格的个数…

四川易点慧电子商务抖音小店:潜力无限的新零售风口

在当今数字化浪潮中&#xff0c;电子商务已经成为推动经济发展的重要引擎。四川易点慧电子商务有限公司凭借其敏锐的市场洞察力和创新精神&#xff0c;成功在抖音小店这一新兴平台上开辟出一片新天地。本文将探讨四川易点慧电子商务抖音小店的潜力及其在新零售领域的影响力。 一…

多C段的美国站群服务器有什么用途?

多C段的美国站群服务器有什么用途? 多C段的美国站群服务器是一种常见的网络运营策略&#xff0c;其用途主要体现在以下几个方面&#xff1a; 多C段的美国站群服务器有什么用途? 1. 提高站点排名和流量 部署多个站点在不同的C段IP地址上&#xff0c;可以通过不同的IP地址发布…

OpenGrok使用

以前都是用的find&#xff0c;或者VScode里面的浏览&#xff0c;但是到了Android这个就不行了&#xff0c;代码太多了。都在用OpenGrok&#xff0c;所以俺也用一下。 这里有两个步骤&#xff0c;一个是安装&#xff0c;是一个使用。 1 安装 大概看了一下&#xff0c;安装是to…

关于Clion开发stm32printf重定向问题简单解决问题方法

title: 关于Clion开发stm32printf重定向问题简单解决问题方法 tags: STM32Clion 参考来源1 这是另一种方法 在printf 重定向的基础上加上 一句 setbuf(stdout,NULL); 参考来源2 自己写的笔记啦

小语言模型的潜力

想象一下这样一个世界&#xff1a;智能助手不在云端&#xff0c;而是在你的手机上&#xff0c;无缝了解你的需求并以闪电般的速度做出响应。这不是科幻小说&#xff0c;而是科幻小说。这是小语​​言模型 (SLM) 的希望&#xff0c;这是一个快速发展的领域&#xff0c;有可能改变…

【一起深度学习——批量规范化】

批量规范化 1、为啥要批量规范化呢&#xff1f;2、如何批量规范化呢&#xff1f;3、实现批量归一化。4、定义BatchNorm层&#xff1a;5、定义神经网络&#xff1a;6、开始训练&#xff1a; 1、为啥要批量规范化呢&#xff1f; 1、可持续加速深层网络的收敛速度。 2、对于深层网…

罗德与施瓦茨 SMC100A信号发生器9kHz至3.2 GHz

罗德与施瓦茨 SMC100A信号发生器&#xff0c;9 kHz - 3.2 GHz 罗德与施瓦茨 SMC100A 以极具吸引力的价格提供出色的信号质量。它覆盖的频率范围为 9 kHz 至 1.1 GHz 或 3.2 GHz。输出功率为典型值。> 17 dBm。所有重要功能&#xff08;AM/FM/φM/脉冲调制&#xff09;均已集…

代码随想录算法训练营第六十天| 647. 回文子串,516.最长回文子序列,动态规划总结篇

题目与题解 参考资料&#xff1a;动态规划总结篇 647. 回文子串 题目链接&#xff1a;647. 回文子串 代码随想录题解&#xff1a;647. 回文子串 视频讲解&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串_哔哩哔哩_bilibili …

【Camera2完整流程分析三】从Log角度跟踪分析原生Camera2相机分析相机拍照流程

一,概述 通过阅读本篇文件后,你会了解到原生Camera2的从app层到framework,再到camera service层,最后到Hal3层的完整代码架构和代码流程。学习本篇文章后可以对拍照take picture快速上手,并能通过log跟踪来快速分析和定位问题,具体知识点的如下: 1,Camera2在app层摄像…

【busybox记录】【shell指令】unexpand

目录 内容来源&#xff1a; 【GUN】【unexpand】指令介绍 【busybox】【unexpand】指令介绍 【linux】【unexpand】指令介绍 使用示例&#xff1a; 空格转化成制表符 - 默认输出 空格转化成制表符 - 转换所有的空格 空格转化成制表符 - 指定制表位 常用组合指令&#…

项目提交到空的git仓库流程

流程&#xff1a; # 初始化 Git 仓库 git init # 如果遇到 "detected dubious ownership" 的错误&#xff0c;可以添加 safe.directory 配置以解决 git config --global --add safe.directory T:/project/heima-leadnews # 将当前目录下的所有文件添加到 Git 暂存区…

构造照亮世界——快速沃尔什变换 (FWT)

博客园 我的博客 快速沃尔什变换解决的卷积问题 快速沃尔什变换&#xff08;FWT&#xff09;是解决这样一类卷积问题&#xff1a; ci∑ij⊙kajbkc_i\sum_{ij\odot k}a_jb_k ci​ij⊙k∑​aj​bk​其中&#xff0c;⊙\odot⊙ 是位运算的一种。举个例子&#xff0c;给定数列 a,…