我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序
大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用。
大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭资源。一个try块后面可以跟多个catch块,如果后面一个catch块也不跟,就一定要跟一个finally 块。
结论1:当在try块遇到return语句时,finally语句块将在方法返回之前被执行,但是返回值不受finally块中重新赋值的影响。
public class FinallyTest {
public static void main(String[] args) throws Exception {
int a = 10;
int sum = throwException(a);
System.out.println("执行返回结果sum:" + sum);
}
public static int throwException(int a) throws Exception{
int b = 20;
int result = 0;
try{
System.out.println("执行try语句块");
result = a+b;
return result;
}catch(Exception e){
System.out.println("执行catch语句块");
}finally{
System.out.println("执行finally语句块");
result = 1;
}
return result;
}
}

结论2:当在catch块遇到return或者throw异常语句时,finally语句块将在方法返回之前被执行,但是返回值不受finally块中重新赋值的影响。
public class FinallyTest {
public static void main(String[] args) throws Exception {
int a = 10;
int sum = throwException(a);
System.out.println("执行返回结果sum:" + sum);
}
public static int throwException(int a) throws Exception{
int b = 20;
int result = 0;
try{
System.out.println("执行try语句块");
result = b / 0;
return result;
}catch(Exception e){
System.out.println("执行catch语句块");
return result;
}finally{
System.out.println("执行finally语句块");
result = 1;
}
}
}

结论3:如果try,finally语句里均有return,忽略try的return值,而使用finally的return值
public class FinallyTest {
public static void main(String[] args) throws Exception {
int a = 10;
int sum = throwException(a);
System.out.println("执行返回结果sum:" + sum);
}
public static int throwException(int a) throws Exception{
int b = 20;
int result = 0;
try{
System.out.println("执行try语句块");
result = a + b;
return result;
}catch(Exception e){
System.out.println("执行catch语句块");
}finally{
System.out.println("执行finally语句块");
result = 1;
return result;
}
}
}

结论4 :在finally语句块发生了异常,finanly语句块中异常后面的代码不会再执行。
public class FinallyTest {
public static void main(String[] args) throws Exception {
int a = 10;
int sum = throwException(a);
System.out.println("执行返回结果sum:" + sum);
}
public static int throwException(int a) throws Exception{
int result = 30;
try{
System.out.println("执行try语句块");
return result;
}catch(Exception e){
System.out.println("执行catch语句块");
}finally{
int exception = b / 0;
System.out.println("执行finally语句块");
result = 1;
}
return result;
}
}

结论5:try语句块发生异常,并且finally语句块也发生了异常,finally块中的异常会掩盖try块中的异常。
public class FinallyTest {
public static void main(String[] args) throws Exception {
int a = 10;
int sum = throwException(a);
System.out.println("执行返回结果sum:" + sum);
}
public static int throwException(int a) throws Exception{
int result = 0;
try{
System.out.println("执行try语句块");
result = a / 0 ;
return result;
}catch(Exception e){
throw new Exception(e);
}finally{
int[] arr = new int[1];
arr[2] = 3;
System.out.println("执行finally语句块");
}
}
}

通过上面的5个案例,我们应该对try 块,catch块,finally 块中return的执行顺序有了清晰的理解,下面我们在进行总结一下。
1. 当在try块遇到return语句时,finally语句块将在方法返回之前被执行,但是返回值不受finally块中重新赋值的影响。
2. 当在catch块遇到return或者throw异常语句时,finally语句块将在方法返回之前被执行,但是返回值不受finally块中重新赋值的影响。
3. 如果try,finally语句里均有return,忽略try的return,而使用finally的return。
4 . 在finally语句块发生了异常,finanly语句块异常后面的代码不会在执行。
5:try{}语句块发生异常,并且finally语句块也发生了异常,finally块中的异常会掩盖try块中的异常。
另外,关于1,2两点,不受finally块影响的原理,我做一个补充,为什么在finally块改变try块中的返回值,结果不受影响了?
如果try语句里有return,返回的是try语句块中的局部变量值。 详细执行过程如下:
①首先我们在try快中,会把返回值保存到局部变量中;
② 然后执行jsr指令跳到finally语句里执行;
③ 执行完finally语句后,返回之前保存在局部变量表里的值,所以finally块里改变try块中的返回值,不会生效。(但是上面第3点场景,finally自己带return返回值除外)
感谢大家的观看,如有错误之处,欢迎指出,共同学习,共同进步~
如果大家看我的文章觉得有所收获,请将文章分享给你们的朋友,后续我会更新更多浅显,优质的技术文章!
我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序的更多相关文章
- 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解
一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...
- 【repost】js中(function(){…})()立即执行函数写法理解
摘要: javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ...
- js中(function(){…})()立即执行函数写法理解
文章摘自https://my.oschina.net/u/2331760/blog/468672?p={{currentPage+1}} 摘要: javascript和其他编程语言相比比较随意,所以j ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
- C++-理解构造函数、析构函数执行顺序
先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...
- IIFE-js中(function(){…})()立即执行函数写法理解
介绍IIFE IIFE的性能 使用IIFE的好处 IIFE最佳实践 jQuery优化 在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的 ...
- mirantis fuel puppet执行顺序 和 对整个项目代码的执行流程理解
stage执行顺序 stage {'zero': } -> stage {'first': } -> stage {'openstack-custom-repo': } -> sta ...
- junit4X系列源码--Junit4 Runner以及test case执行顺序和源代码理解
原文出处:http://www.cnblogs.com/caoyuanzhanlang/p/3534846.html.感谢作者的无私分享. 前一篇文章我们总体介绍了Junit4的用法以及一些简单的测试 ...
随机推荐
- VueJs 权限管理
程序运行时,router只配置登陆 首页404 等基本页面 import Main from '@/views/Main.vue'; // 不作为Main组件的子页面展示的页面单独写,如下 expor ...
- Vue中的scoped及穿透方法
何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...
- Hbuilder之开发Python
.开发之前,安装Python 3.6 在Mac上安装Python 如果你正在使用Mac,系统是OS X 10.8~10.10,那么系统自带的Python版本是2.7.要安装最新的Python 3.6, ...
- JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明
1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...
- Tomcat配置与优化(内存、并发、管理)与性能监控
原文链接:http://blog.csdn.net/xyang81/article/details/51530979 一.JVM内存配置优化 在开发当中,当一个项目比较大时,依赖的jar包通常比较多, ...
- Centos 6.9 安装xtrabackup-2.4.8 通用包,yum安装,全量备份,增量备份
xtrabackup-2.4.8的安装及使用 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备 ...
- Kali Linux配置ssh服务
操作环境: 虚拟机操作系统: Kali Linux 2017.2 虚拟化软件: VMware Workstation 14 pro 虚拟机网络连接方式: 桥接模式 物理机操作系统: Windows10 ...
- Scrapy爬虫框架第八讲【项目实战篇:知乎用户信息抓取】--本文参考静觅博主所写
思路分析: (1)选定起始人(即选择关注数和粉丝数较多的人--大V) (2)获取该大V的个人信息 (3)获取关注列表用户信息 (4)获取粉丝列表用户信息 (5)重复(2)(3)(4)步实现全知乎用户爬 ...
- 跨域问题实践总结!下( [HTML5] postMessage+服务器端(反向代理服务器+CORS Cross-Origin Resource Sharing))
4. [HTML5] postMessage 问题: 对于跨域问题,研究了一下html5的postMessage,写了代码测试了一下,感觉html5新功能就是好用啊.此文仅使用html5的新特性pos ...
- 数据分析工具Pandas
参考学习资料:http://pandas.pydata.org 1.什么是Pandas? Pandas的名称来自于面板数据(panel data)和Python数据分析(data analys ...