以前总结的是: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执行路径总结相关推荐

  1. 异常 try catch finally return 执行关系 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. 当try、catch中有return时,finally中的代码会执行么?

    今天,看到一个面试题: try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 我们用代码来验证下: public static void mai ...

  3. 有return的情况下try catch finally的执行顺序

    前言,在写java 异常捕捉块的时候,有时候用到return,有时有各种情况,不仔细分析的化就会出现意想不到的问题,所以我测试一般情形,用于记录一下. 情景1:try{}catch{}finally{ ...

  4. try catch finally return的执行顺序与返回值探究

    下午看了一下百度文库中下载下来的java笔试题,其中一道就是关于这个问题的,所以写了个测试程序验证了一下,另外具体的理论知识搜罗了网上的资料. 测试程序如下: package com.andy.cod ...

  5. try catch和finally搭配return执行常见面试题讲解

    我们都知道,在Java中try.catch和finally常用来做异常处理,而且他们有执行顺序,即先执行try,如果try中没有异常,则执行完try语句块后执行finally语句块,如果try中有异常 ...

  6. try—catch—finally中,如果catch中return了,finally还会执行吗?

    1.如果catch中return了,finally还会执行吗 有异常 public class Test {public static void main(String[] args) {System ...

  7. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗

    finally 一定会执行 try-catch-finally中return的执行情况: 在try中没有异常的情况下try.catch.finally的执行顺序 try --- finally 如果t ...

  8. Java中finally和return执行顺序

    思考一个问题 Java异常捕获机制try-catch-finally块中的finally语句是否一定会被执行?起码在以下两种情况下是不会被执行的: 1.在try之前就返回了,try没有执行到. 2.t ...

  9. try catch finally的执行顺序到底是怎样的?

    首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分. 关于一个函数的执行过程是,当有return以后,函数就会把这个数据存储在某个位置 ...

最新文章

  1. 使用方差阈值过滤(VarianceThreshold)进行特征选择、删除方差低于某一阈值的特征、详解及实战
  2. H.264 视频的 RTP 载荷格式
  3. 一阶网络相应特性的研究_36、 用一阶系统描述的传感器,其动态响应特征的优劣也主要取决于时间常数τ,τ越大越好。( )...
  4. HDU 4609 3-idiots(FFT)
  5. 华为NOVa8Pr0是用鸿蒙系统吗,华为Nova8即将发布,采用麒麟芯片,高端平板适配鸿蒙系统...
  6. python列表与集合
  7. 阶段3 1.Mybatis_12.Mybatis注解开发_1 mybatis注解开发的环境搭建
  8. goaccess分析nginx日志
  9. rhadoop之mapreduce函数
  10. Stata:投资组合有效边界
  11. 从多个文档在Word 2010中创建主文档
  12. html表格怎么加图片,添加图片到HTML表格动态
  13. 主流量化交易与程序化交易平台整理
  14. html添加空隙,html空隙
  15. 为fetch添加拦截器功能
  16. java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程
  17. 华科出身,师从贾佳亚,从鹅厂到创业,90后如何登上胡润U30?
  18. 今日头条校招2016-09-28在线编程题(2题)
  19. 项目集锦 | 易基因DNA羟甲基化5hmC测序研究成果
  20. 基于模型的无人机开发

热门文章

  1. 事理图谱概念辨析及其与风险标签分类结合的应用探讨
  2. Docker:Redis启动命令
  3. Lodop打印设计界面生成代码带”...(省略)”
  4. 淘淘相关工具类【json,httpClient,id,FTP,exception,cookie(包括共享cookie的设置等)】
  5. Go语言入门——Go语言环境搭建
  6. php简单的用户留言板实现内容(1-23)
  7. 09.07 jQuery 随意整理
  8. [转载]sql server 分布式查询
  9. 遗传算法学习笔记(一):常用的选择策略
  10. hdu - 2667 Proving Equivalences(强连通)