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块中的代码一定会有效 ...
随机推荐
- Android四大组件之actiivity
1.Acitivity Activity是Android一个非常重要的用户接口(四大组件之一),是可见的,主要是用户和应用程序之间进行交互的接口.在每个Activity中都可以放很多控件,所以也可以把 ...
- 完成对数据库的CRUD操作
PS:查询相对复杂,要处理结果集,增删改则不用. package it.cast.jdbc; import java.sql.Connection; import java.sql.ResultSet ...
- mac安装tensorflow报错
问题:mac安装tensorflow过程中,爆出oserror:permission denied 解决方案:关闭mac的sip,然后sudo安装 关闭sip的方法:重启mac,按住command+R ...
- jQuery File Upload 单页面多实例的实现
jQuery File Upload 的 GitHub 地址:https://github.com/blueimp/jQuery-File-Upload 插件描述:jQuery File Upload ...
- 阿里云服务器Linux CentOS安装配置(二)yum安装svn
阿里云服务器Linux CentOS安装配置(二)yum安装svn 1.secureCRT连接服务器 2.先创建一个文件夹,用来按自己的习惯来,用来存放数据 mkdir /data 3.yum安装sv ...
- css定位 与position
本文同时发表于本人个人网站 www.yaoxiaowen.com 在正式讨论position之前,我们需要知道几个概念. 块元素:独占一行的元素.比如div,h1~h6,p等,它是自带换行的. 内联元 ...
- 去除select的样式
select::-ms-expand { display: none } .info-select { width: 88px; height: 25px; border: none; outline ...
- 调用CachedRowSetImpl类时出现错误
调用CachedRowSetImpl类时,出现以下错误: Access restriction: The type CachedRowSetImpl is not accessible due to ...
- WordPress多站点获取当前博客信息
http://www.utubon.com/1495/wordpress-multisite-get-current-bolg-info global $current_blog; 它的返回结果是: ...
- (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)
转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml) 根据输入 ...