平时大家try…catch…finally语句用的不少,知道finally块一定会在try…catch..执行结束时执行,但是具体是在什么时候执行呢,今天我们一起来看下。

public static int test1(){
int i = 0;
try{
return ++i;
}finally{
++i;
}
}

上面的方法,执行结果返回1。finally块中的代码会不会没有执行,我们再试试。

public static int test2(){
int i = 0;
try{
return ++i;
}finally{
return ++i;
}
}
test2()执行结果返回2。可以肯定的是,finally块执行了。我们对比test1()和test2(),可以得出如下结论:
1. finally块会在try块return语句执行后,执行结果返回前执行;
2. 如果finally块中有return语句,并且是返回的是值类型,则会覆盖try块的return结果。
那么,如果返回的不是值,而是对象呢?
public static Integer test3(){
Map<Integer,Integer> map = new HashMap<>();
map.put(0, new Integer(0));
try{
map.put(0, new Integer(1));
return map.get(0);
}finally{
map.put(0, new Integer(2));
}
}
public static Integer test4(){
Map<Integer,Integer> map = new HashMap<>();
map.put(0, new Integer(0));
try{
map.put(0, new Integer(1));
return map.get(0);
}finally{
map = null;
}
}
显然,finally块肯定执行了,但是test3()和test4()返回的均是1。我们将test3()稍微修改下,改成下面的test5(),
然后执行System.out.println(test5().get(0)),会发现执行结果是2.
public static Map<Integer,Integer> test5(){
Map<Integer,Integer> map = new HashMap<>();
map.put(0, new Integer(0));
try{
map.put(0, new Integer(1));
return map;
}finally{
map.put(0, new Integer(2));
}
}
对比test3(),test4(),test5()的代码和返回结果,估计大家都发现了,这其实还是java的值传递问题,只是平时可能作为形参出现的更多些,这里是作为返回值。
当返回的是引用地址时,只有finally块中修改的是返回地址对象内的属性,try块的return结果才会被修改。方法test5(),返回map对象的引用地址,finally块中对map做的修改,影响到try块return的map;而test3()和test4(),返回的是Integer对象的引用地址,finally块中对map做的修改,并不会对其有影响(从jvm内存模型的角度去看,会更好理解,可是图我不知道怎么画会比较形象[难过])。
本文中的方法demo中都没有catch,但是catch块对于finally块,和try是一样的,有兴趣的朋友可以试试。

Java基础之回味finally的更多相关文章

  1. 如何快速打好Java基础?

    二哥,我是一名大学生,专业是电力工程,但想自学 Java,如何快速打好基础呢? 微信上 tison 向我提出了这个问题.我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多 ...

  2. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  3. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  4. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  5. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  6. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  7. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  9. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--2.63图像指数增强

    原文:Win8 Metro(C#)数字图像处理--2.63图像指数增强  [函数名称]   指数增强      WriteableBitmap IndexenhanceProcess(Writea ...

  2. LCID

    Language Location (or type) Language ID Language tag Supported version Afar   0x1000 aa Release 9 Af ...

  3. 【Qt】无边框窗体中带有ActiveX组件时的一个BUG

    无意中发现的一个BUG,Qt5.1.1正式版首先创建一个GUI工程,拖入一个QAxWidget控件(为了使ActiveX生效,需要在.pro文件中加入CONFIG += qaxcontainer)接着 ...

  4. 通过内核对象在服务程序和桌面程序之间通信的小问题 good

    关于在通过 事件对象 在服务程序和普通桌面应用程序相互之间通信的问题,分类情况进行讨论:1.普通桌面应用程序中创建事件,服务程序中打开事件 XP的情况普通桌面应用程序中创建: m_hEvent = : ...

  5. 再谈Delphi关机消息拦截 -- 之控制台程序 SetConsoleCtrlHandler(控制台使用回调函数拦截,比较有意思)

    这里补充一下第一篇文章中提到的拦截关机消息 Delphi消息拦截:http://blog.csdn.net/cwpoint/archive/2011/04/05/6302314.aspx 下面我再介绍 ...

  6. 学习Java,容易被你忽略的小细节(2)

    昨天心情真的太糟糕了,写完<学习Java,值得注意你注意的问题(1)>之后,迎来些许的支持以后就是一片片的谴责.我的主页上涌现出许许多多Java方面的牛人,谴责我水平太低,写的问题太初级. ...

  7. http 报错码对应的错误原因

    转:http://blog.csdn.net/cutbug/article/details/4024818 1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多 ...

  8. Paragon NTFS for Mac 15.5.53 中文破解版(激活码)下载

    Paragon NTFS for Mac中文破解版是一款超级受欢迎的简单.高效.安全的格式读写软件,提供给大家,再也不用到处找Paragon NTFS序列号和Paragon NTFS激活码啦,帮您轻松 ...

  9. 第五章 .net core该怎么玩

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

  10. Netty源码分析--NIO(一)

    好久没写博客了,最近打算花些时间把Netty的源码好好读一读,下面是本人在学习的过程中的一些笔记,不能确保自己思考的完全是正确的,如果有错误,欢迎大家指正. 由于本人的语文功底烂的很,通篇使用大白话来 ...