try-catch-finally-return执行路径总结
以前总结的是:finally总是在return 前执行。
这句话是没错,但是遇到如下代码。分析返回值时却解释不通了。
public int inc(){int x;try{x = 1;return x;}catch( Exception e ){x =2 ;return x;}finally{x = 3;}}
这个方法执行完后,返回的是多少呢?
如果按照前面的结论( finally 总是在return 前执行 ),那么变量x 总是被赋值为 3。所以返回值应该是 3。
实际运行结果是:1 !!!
为什么会这样呢?
通过单步调试发现执行路径如下:
先是, x = 1 ;
然后,return x ;
在然后,x = 3 ;
最后,return x ;
原来, return x 这一句有两步操作:
第一步,将 x 的值复制一份副本到最后一个本地变量表的 Slot 中(这个 Slot 里面的值在 ireturn 指令执行前会被重新读到操作栈顶,作为返回值使用 )
第二步,ireturn 返回 Slot中的值
这样也就解释的通,为什么最后返回值是1 了!
finally 语句块中的 x = 3,无法改变 Slot 中的值,所以返回的仍然是1。
上面的是针对原始类型操作而言,如果是引用类型呢?是不是会改变(毕竟同一引用)?
如下代码
public StringBuilder append(){StringBuilder sb = new StringBuilder();try{sb.append( "1" );return sb;}catch( Exception e ){sb.append( "2" );return sb;}finally{sb.append( "3" );}}
运行结果:13
表明上面的结论是正确的。
--------------------------------------------------------
下面是针对会抛出异常的情形,分析同上,仅做演示:
public int inc(){int x;try{x = 1;throwMethod();return x;}catch( Exception e ){x =2 ;return x;}finally{x = 3;}}public StringBuilder append(){StringBuilder sb = new StringBuilder();try{sb.append( "1" );throwMethod();return sb;}catch( Exception e ){sb.append( "2" );return sb;}finally{sb.append( "3" );}}public void throwMethod() throws Exception{throw new Exception( "抛出异常" );}
运行结果为:
2
123
try-catch-finally-return执行路径总结相关推荐
- 异常 try catch finally return 执行关系 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 当try、catch中有return时,finally中的代码会执行么?
今天,看到一个面试题: try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 我们用代码来验证下: public static void mai ...
- 有return的情况下try catch finally的执行顺序
前言,在写java 异常捕捉块的时候,有时候用到return,有时有各种情况,不仔细分析的化就会出现意想不到的问题,所以我测试一般情形,用于记录一下. 情景1:try{}catch{}finally{ ...
- try catch finally return的执行顺序与返回值探究
下午看了一下百度文库中下载下来的java笔试题,其中一道就是关于这个问题的,所以写了个测试程序验证了一下,另外具体的理论知识搜罗了网上的资料. 测试程序如下: package com.andy.cod ...
- try catch和finally搭配return执行常见面试题讲解
我们都知道,在Java中try.catch和finally常用来做异常处理,而且他们有执行顺序,即先执行try,如果try中没有异常,则执行完try语句块后执行finally语句块,如果try中有异常 ...
- try—catch—finally中,如果catch中return了,finally还会执行吗?
1.如果catch中return了,finally还会执行吗 有异常 public class Test {public static void main(String[] args) {System ...
- try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗
finally 一定会执行 try-catch-finally中return的执行情况: 在try中没有异常的情况下try.catch.finally的执行顺序 try --- finally 如果t ...
- Java中finally和return执行顺序
思考一个问题 Java异常捕获机制try-catch-finally块中的finally语句是否一定会被执行?起码在以下两种情况下是不会被执行的: 1.在try之前就返回了,try没有执行到. 2.t ...
- try catch finally的执行顺序到底是怎样的?
首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分. 关于一个函数的执行过程是,当有return以后,函数就会把这个数据存储在某个位置 ...
最新文章
- 使用方差阈值过滤(VarianceThreshold)进行特征选择、删除方差低于某一阈值的特征、详解及实战
- H.264 视频的 RTP 载荷格式
- 一阶网络相应特性的研究_36、 用一阶系统描述的传感器,其动态响应特征的优劣也主要取决于时间常数τ,τ越大越好。( )...
- HDU 4609 3-idiots(FFT)
- 华为NOVa8Pr0是用鸿蒙系统吗,华为Nova8即将发布,采用麒麟芯片,高端平板适配鸿蒙系统...
- python列表与集合
- 阶段3 1.Mybatis_12.Mybatis注解开发_1 mybatis注解开发的环境搭建
- goaccess分析nginx日志
- rhadoop之mapreduce函数
- Stata:投资组合有效边界
- 从多个文档在Word 2010中创建主文档
- html表格怎么加图片,添加图片到HTML表格动态
- 主流量化交易与程序化交易平台整理
- html添加空隙,html空隙
- 为fetch添加拦截器功能
- java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程
- 华科出身,师从贾佳亚,从鹅厂到创业,90后如何登上胡润U30?
- 今日头条校招2016-09-28在线编程题(2题)
- 项目集锦 | 易基因DNA羟甲基化5hmC测序研究成果
- 基于模型的无人机开发
热门文章
- 事理图谱概念辨析及其与风险标签分类结合的应用探讨
- Docker:Redis启动命令
- Lodop打印设计界面生成代码带”...(省略)”
- 淘淘相关工具类【json,httpClient,id,FTP,exception,cookie(包括共享cookie的设置等)】
- Go语言入门——Go语言环境搭建
- php简单的用户留言板实现内容(1-23)
- 09.07 jQuery 随意整理
- [转载]sql server 分布式查询
- 遗传算法学习笔记(一):常用的选择策略
- hdu - 2667 Proving Equivalences(强连通)