publicclassTrycatchTest{

publicstaticvoidmain(String[]args){

System.out.println("x:"+newTrycatchTest().test());

}

inttest(){

intx=1;

try{

System.out.println("trystart");

x++;

returnx;

}finally{

System.out.println("finallystart");

x++;

System.out.println("finallyend");

}

}

}

输出的x是2还是3?

结果:

trystart

finallystart

finallyend

x:2

也就是说,try语句执行到return前将要返回的x值2 保存了,然后进入到finally,之后再回到try中返回之前保存的值,也就是说不管finally中你x怎么变化,返回的值都是返回之前保存的,与后来发生的改变无关。

好的,再看下面这个例子:

publicclassTrycatchTest{

publicstaticvoidmain(String[]args){

System.out.println("x:"+newTrycatchTest().test());

}

inttest(){

intx=1;

try{

System.out.println("trystart");

x++;

returnx;

}finally{

System.out.println("finallystart");

x++;

returnx;

}

}

}

代码跟上面基本一样,只不过在finally中加了一条 return x ; 猜猜这时候返回值为多少?

输出结果:

trystart

finallystart

x:3

解析: try中x自加后为2,这时候看到了return语句保存了当前的值2,然后进入了finally代码块,x自加为3。关键来了,这时候多了条return语句。首先第一个问题:这条语句执行吗?第二:还会回到try吗? 根据java的设计原则,finally中的语句必须是要执行的,所以finally中的return自然也会作为一条正常语句执行掉,那么还会回到try吗? 代码块都已经return结束掉了,还会再回去return一条吗?对吧,明显是不能的。 那么x值为多少,在当下的finally中x值为3然后直接给return回去了,所以是3。

再看看下面的例子:

publicclassTrycatchTest{

publicstaticvoidmain(String[]args){

System.out.println("x:"+newTrycatchTest().test2());

}

inttest2(){

intx=1;

try{

x++;

if(x==2){

System.out.println("tryx:"+x);

thrownewException();

}

returnx;

}catch(Exceptione){

x++;

System.out.println("catch:"+x);

returnx;

}finally{

x++;

}

}

}

代码也很简单,加了个catch代码块,在try中将异常抛出就会进入到catch代码块中,注意这时候在catch中加入了条return语句,那么结果是多少?

tryx:2

catch:3

x:3

看到没,也是之前的规则:首先try中x自加为2,然后抛出了异常进入到catch,自加为3,这时候当想要return的时候将3的值暂存下来,进入到finally,finally中的x值自加为4, 然后回到try,return掉之前保存的值3.

好了,估计你也多少明白了,每次我们要return前,都会将return的值都暂时保存下来,然后为了符合java设计规范我们不得不临时跳到其他代码块处理些事情,处理完再把我们暂存的值给返回;如果我们跳到其他代码块的时候遇到了return语句,就直接执行了那个代码块中的返回语句了,之前保存的值无效。 最后再看一个例子:

publicclassTrycatchTest{

publicstaticvoidmain(String[]args){

System.out.println("x:"+newTrycatchTest().test2());

}

inttest2(){

intx=1;

try{

x++;

if(x==2){

System.out.println("tryx:"+x);

thrownewException();

}

returnx;

}catch(Exceptione){

x++;

System.out.println("catch:"+x);

returnx;

}finally{

x++;

System.out.println("finallyx:"+x);

returnx;

}

}

}

在finally中加了条return语句,聪明的你此刻一定能猜出最终返回值是多少了,没错,就是4。 看下面的结果:

tryx:2

catch:3

finallyx:4

x:4

如果你能猜出来,代表你已经掌握了,如果还不清楚,再看看我上边写的,应该没多大问题。带有return 的try catch在面试题中经常会出现,掌握一下还是有必要了

今天在2cto网站看到一个有关try{}catch(){}finally{}语句中含有return的讲解,理解很透彻。的更多相关文章

  1. hibernate多生成一个外键以及映射文件中含有<list-index>标签

    (原文地址: http://blog.csdn.net/xiaoxian8023/article/details/15380529) 一.Inverse是hibernate双向关系中的基本概念.inv ...

  2. oracle问题:新建了一个PDM文件,建表后生成的sql语句中含有clustered

    问题描述 为了在oracle中新增表,在PDM中建表,使用其生成的sql语句,但是建表不能成功,提示 ORA-00906: 缺失左括号 原因是多了clustered 关键字 情景重现 1. 新建一个p ...

  3. 如何在一个网站或者一个页面,去书写你的JS代码

    // JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...

  4. 对怎样充分利用安卓官方开发网站的一个简单性介绍介绍-https://developer.android.google.cn/docs/

    一,谷歌的安卓官方网站-https://developer.android.google.cn/docs/ ,在网站里面可以查询开发文档,开发指导,设计原则,制作app的例子等等,无论对于新手还是老手 ...

  5. phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)

    phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php) 一.总结 一句话总结:把原生php的网站直接放到thinkphp5的public目录下可以解决以stem.aaaa. ...

  6. 腾讯ISUX网站的一个小问题

    腾讯isux网站的一个小问题. 它的网站:http://isux.tencent.com/?variant=zh-hans     优秀的网站和差的网站的距离往往就在于细节.   浏览环境:谷歌.   ...

  7. 大型网站都喜欢把js写在html中的真正原因

    相信经常观察大站的朋友都会发现,他们都把CSS写在HTML页面里,一个页面的或者多个页面的背景图片,都集成到一张图片里,他们有的JS文件,也写到页面里了……也许你会迷惑,现在到处讲页面的优化,不都是要 ...

  8. 一个App与另一个App之间的交互,添加了自己的一些理解

    URL Scheme 是什么? iOS有个特性就是应用将其自身"绑定"到一个自定义 URL scheme 上,该 scheme用于从浏览器或其他应用中启动本应用.常见的分享到第三方 ...

  9. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

随机推荐

  1. 最长公共子串和子序列的Python实现,带图示。

    使用矩阵来记录两个子串之间各个字符之间的对应关系. 最长子串:矩阵中数字最大的就是最长子串的长度.若对应位置字符相同,则c[i][j] = c[i-1][j-1] + 1 def longSubStr ...

  2. Hive中数据加载失败:root:supergroup:drwxr-xr-x

    Hive中数据加载失败:inode=:root:supergroup:drwxr-xr-x 在执行hive,数据加载的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,背后原理也 ...

  3. python变量存储

    变量的存储 在高级语言中,变量是对内存及其地址的抽象. 对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只 ...

  4. Android中的几个基本常用控件

    Android 中常用的几大UI控件 1. TextView : 用于在界面中显示一段文本信息 <TextView android:id="@+id/text_view" / ...

  5. Ubuntu每次启动都显示System program problem detected

    执行命令:sudo gedit /etc/default/apport 将enabled=1改为enabled=0保存退出

  6. 结对作业_core组

    github地址:https://github.com/ljw-wakeup/expression_project2 对于这种结对的工作,由于有过电子设计实践的基础,大概知道建一个工程需要做的事,有点 ...

  7. 《JavaScript Dom 编程艺术》读书笔记-第10章

    用JS实现动画~内容包括: 1. 动画基础知识 2. 用动画丰富网页的浏览效果 动画就是让元素的位置随时间而不断变化. 位置: //CSSelement{ position:absolute; top ...

  8. 通过SSH去连接 github 和bitbucket

    github 和 bitbucket 都是项目托管服务器, 1 创建SSH private key and public key 首先需要安装git命令, 并且请检查是否有ssh 命令. 打开 Git ...

  9. jQuery中有关each方法的使用

    概述: each() 方法规定为每个匹配元素规定运行的函数. 返回 false 可用于及早停止循环,相当于break. 返回 true 可以结束本次循环,相当于continue. 语法: $(sele ...

  10. 泊爷带你学go -- 反射的经典玩法

    package main import ( "fmt" "reflect" ) type order struct { ordId int customerId ...