Java中try-catch-finally-return的执行顺序
本文转自撒法第
1. try块中没有抛出异常,try、catch和finally块中都有return语句
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;}
}
测试代码:
public static void main(String[] args) {System.out.println("=============NoException==================");System.out.println(NoException());System.out.println("===============================");
}
执行结果:
=============NoException==================
i in try block is:10
i in finally - from try or catch block is:9
执行顺序:
执行try块,执行到return语句时,先执行return的语句,–i,但是不返回到main方法,执行finally块,遇到finally块中的return语句,执行–i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值。
结论:try-catch-finally都有return语句时,没有异常时,返回值是finally中的return返回的。
2. try块中没有抛出异常,仅try和catch中有return语句
public static int NoException1(){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;}
}
执行结果:
=============NoException1==================
i in try block is:10
i in finally - from try or catch block is:9
i in finally block is:8
执行顺序:
try中执行完return的语句后,不返回,执行finally块,finally块执行结束后,返回到try块中,返回i在try块中最后的值。
结论:try-catch都有return语句时,没有异常时,返回值是try中的return返回的。
3. try块中抛出异常,try、catch和finally中都有return语句
public static int WithException(){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;}
}
执行结果:
=============WithException==================
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
执行顺序:
抛出异常后,执行catch块,在catch块的return的–i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6。
结论:try块中抛出异常,try、catch和finally中都有return语句,返回值是finally中的return。
4. try块中抛出异常,try和catch中都有return语句
public static int WithException1(){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;}
}
执行结果
=============WithException1==================
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
执行顺序:
抛出异常后,执行catch块,执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值。
结论:返回的catch中return值。
5. try、catch中都出现异常,在finally中有返回
public static int WithException2(){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;--i;System.out.println("i in finally block is:"+i);return --i;
}
执行结果:
=============WithException2==================
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:8
执行顺序:
try块中出现异常到catch,catch中出现异常到finally,finally中执行到return语句返回,不检查异常。
结论:返回finally中return值。
6. 只在函数最后出现return语句
public static int WithException3(){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;--i;System.out.println("i in finally block is:"+i);//return --i;}return --i;
}
执行结果:
=============WithException3==================
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:8
总体结论:
结论一:
return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
结论二:
finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:
(1)return语句只在函数最后出现一次。
(2)return语句仅在try和catch里面都出现。
(3)return语句仅在try和函数的最后都出现。
(4)return语句仅在catch和函数的最后都出现。
注意,除此之外的其他做法都是不可行的,编译器会报错。
- 如果finally中有return,返回的一定是finally中的return
- 如果catch中有return,有异常返回的是catch中的,没有就是try中的
Java中try-catch-finally-return的执行顺序相关推荐
- try catch finally return的执行顺序与返回值探究
下午看了一下百度文库中下载下来的java笔试题,其中一道就是关于这个问题的,所以写了个测试程序验证了一下,另外具体的理论知识搜罗了网上的资料. 测试程序如下: package com.andy.cod ...
- java catch中 return_JAVA中try、catch、finally带return的执行顺序总结
try catch 以后只要没有抛出新异常或者return,代码会继续往下执行的. 异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的.即,如果try中没有异常,则顺 ...
- Java中try catch finally语句中含有return语句的执行情况
最近刷笔试题遇到的问题,记录下来. 在这里看到了try >但有一点是可以肯定的,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那 ...
- Java 中 finally 与 return 的执行顺序详解
java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域: 1 . 操作数栈,用来保存正在执行的表达式中的操作数, ...
- java中finally和return的执行顺序
注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有re ...
- java中的强行终止线程的执行
不合理 package com.bjpowernode.java.thread; /* 在java中怎么强行终止一个线程的执行.这种方式存在很大的缺点:容易丢失数据.因为这种方式是直接将线程杀死了,线 ...
- java中try,catch,finally的作用
try { //执行的代码,其中可能有异常.一旦发现异常,则立即跳到catch执行.否则不会执行catch里面的内容 } catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 ...
- java中try catch的中断规则
如果try中发生异常,则try块中的代码不会继续执行,直接执行catch中的代码,但是try catch 后的代码会正常执行. 如果throw异常的话,会执行finally中的代码,其他代码不执行.
- Java中try catch语句的用法
在 Java 中通常采用 try catch 语句来捕获异常并处理.语法格式如下: try { 逻辑代码块1; } catch(ExceptionType e) { 处理代码块1; ...
- 1.8 finally和return的执行顺序
在 Java 的异常处理中,try.catch 和 finally 是按顺序执行的. 如果 try 中没有异常,则顺序为 try→finally, 如果 try 中有异常,则顺序为 try→catch ...
最新文章
- pci规划的三个原则_NR PCI规划
- boost::visit_each的用法实例
- 苹果开发(二) 申请应用
- 鼠标滚轮事件及解决滚轮事件多次触发问题
- 通过stream去重_stream去重
- notempty注解属于哪个依赖_Spring框架 之@Valid注解的使用(嵌套类型的效验)
- leetcode —— 513. 找树左下角的值
- redis3.x集群搭建
- Flutter 本地数据库sqflite实战操作
- ubuntu 下载 迅雷
- [战略]对空间_日志风格_日志分类_日志标记_的整体说明
- 图书销售系统测试报告
- 芬兰政府:要找到量子计算工业化的好时机
- Node-RED中使用JSON数据建立web网站
- ES6 数组转为对象 ,以及 find 在数组里面找到对应一条数据
- Qt - QRegExp 正则表达式
- 织梦dedecms会员中心投稿,管理员审核后,文档稿件动态浏览,禁止生成静态页
- CBoard框架数据集实现--DataProvider
- 《FPGA并行编程》读书笔记专栏启动说明
- 插值拟合matlab程序,Matlab插值和拟合
热门文章
- beego mysql增删改查_5-BeegoORM增删改查-Go语言中文社区
- icem合并面网格_详解Flunet Meshing:高级网格划分工具中的“扫地僧”
- 算法:找出存在子字符串的最先位置28. Implement strStr()
- 翻译:图解HTTPS工作原理、秘钥、握手、HTTPS,SSL,TLS的区别、证书
- android 平板怎么截图,在安卓手机或平板电脑上截屏的5种方法,学起来!
- LRN局部响应归一化
- python中os模块作用
- Java反射机制--反射概述
- 华为鸿蒙巴龙麒麟,华为5G新机强势曝光:麒麟985+巴龙5000+鸿蒙系统,颜值性能炸裂...
- mysql 命令创建一个用户名和密码_Mysql的进入数据库指令和创建新用户密码的介绍...