try,catch,finally含return时的执行顺序及丢失的伪例
最近面试遇到一个之前也看到过但没去看一下的问题。就是有return情况下的try,catch,finally的执行顺序。
今天写了下。
先看顺序问题。总结如下:
一:finally中没有写return:
1.不管有没写catch,也不管有没异常,不管try与catch内有没有return,finally始终会执行。
2.finally是在return后面的表达式运算后执行的,此时的i值会被保存(finally不做return,其他变化i值的操作不会产生结果),所以此时返回值是在finally执行前确定的那个函数值;
打debug可以看到:无异常时,try执行(可以看到i为1)后执行finally,之后又会回到try中return,虽然此时的i值不是1了,但是接着执行test()发现,结果为finally执行之前的i值,也就是1,即try-finally- try;有异常时,try在执行到异常时,被catch捕获,执行catch,i被重新赋值,之后执行finally,但· 随后,程序还是会回来 catch中,finally中语句不产生影响,随后rest()结果为重新赋值的值,即try-catch-finally-catch(如图)。
二:finally里有return:
1.此时会看到警告:finally block does not complete normally,下面几点可以解释其出现的原因。
2.无异常,程序会提前结束,最终返回会是rerun操作的值。即try-finally。(此时catch有没有一样,不会走到)
3.有异常,不处理:此时竟可try里走到异常后直接走finally,返回结果自然也是finally操作后的。即try-finally。
异常被finally给吃了,哪也不报错,但原则上3/0是不合理的,这就是警告的原因。也是“丢失的伪例”的表现之一。
4.有异常,处理:然而加上catch进行捕获也是无济于事的。此时顺序为try-catch-finally,且结果仍然为finally执行后的返回值。
这里,我们是不是也可以得出一个结论:”为了避免出现异常被吃,finally的return需要放在finally外面“呢?
第一次使用博客园,还不知道怎么添加代码块。。。所以截图了。。。慢慢摸索。
造成阅读不便则感抱歉,,写文章那里去了。
try,catch,finally含return时的执行顺序及丢失的伪例的更多相关文章
- try、finally代码块有无return时的执行顺序
结论: 1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并 ...
- Java问题解读系列之基础相关---含继承时的执行顺序
今天来研究一下含继承.静态成员.非静态成员时Java程序的执行顺序: 一.不含继承,含有静态变量.静态代码块 创建一个子类,该类包含静态变量.静态代码块.静态方法.构造方法 /** * @create ...
- 错误处理之try、catch、finally中的return、throw执行顺序。
今天遇到一个让人无语的代码块 try { bilSheetService.syncUser(bilWebseviceLog, userId, optType); }catch (Exception e ...
- Java 中 try、catch、finally 语句块的执行顺序
假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
- 当C#中带有return的TryCatch代码遇到Finally时代码执行顺序
编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把 ...
- Java中try、finally语句中有return时的执行情况 [转]
原文:http://kingj.iteye.com/blog/1436761 在Java中当try.finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大 ...
- java之trycatchfinally代码块与return,throw的执行顺序的探索
时光荏苒,转眼间毕业都半年了,java编程也五个月了.写代码的过程中,会经常遇到解决代码抛异常的情况.平时只注重完成功能,也没太注意try_catch_finally的内在执行顺序,只知道表面的现象: ...
- 顽强的的砂锅之——深究finally代码块与return语句的执行顺序!
当问到finally代码块的执行顺序,就算刚刚学编程的小白都能毫不犹豫的说出答案:不管异常发生与否,finally语句块的代码一定会被执行!大体上这样讲是没有错,但是finally块中的代码一定会有效 ...
随机推荐
- lua中的中文乱码
最近在用lua, 发现一个有点意思的槽点啊-____-! 那就是lua貌似会使用系统所用的字符集. 具体点说, 就是在windows上, 它会使用cp936来表示代码中的中文. 来个例子: print ...
- HttpClient_自定义cookie策略
实际使用client的过程中,会遇到一种情况,如cookie的Key为空的,此时默认的cookie的策略处理cookie是会报错. 这时咱可以通过重写cookiestore策略来解决如: /** * ...
- Linux安装软件时缺少依赖包的简单较完美解决方法!
大家在linux下源码安装时,有木有经常碰到缺少这个包那个包的,然后不知所措?看到最近有几个筒子安装thrift,安装python因缺少依赖包而进行不下去了.我用的是红帽,装系统的时候习惯把所有的有的 ...
- Linux下redis的安装
第一部分:安装redis 希望将redis安装到此目录 /usr/local/redis 希望将安装包下载到此目录 /usr/local/src 那么安装过程指令如下: $ mkdir /usr/lo ...
- C#操作XML的方法
添加命名空间: using System.Xml; 1,先创建一个BookModel类 using System; using System.Collections.Generic; using Sy ...
- Java WebService 简单实例
前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作. 一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 ...
- Offline.js - 自动判断网络连接状态并提醒用户
http://www.cnblogs.com/lhb25/p/offline-js-alert-users-when-no-internet-connectivity.html 使用 jslint/j ...
- final阶段成员贡献分
项目名:连连看 组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 final阶段各组员的贡献分分配如下: 姓名 个人工作量 组长评价 个人评价 团队贡献总分 张政 11 7 6 6.00 ...
- 美萍超市销售管理系统标准版access数据库密码mp611
美萍超市销售管理系统标准版access数据库密码mp611 作者:admin 来源:本站 发表时间:2015-10-14 19:01:43 点击:199 美萍超市销售管理系统标准版access后 ...
- FTP提示505错误解决办法
使用ServerU建FTP服务器时,选定了锁定主文件夹,不选即可解决问题.