Java基础之回味finally
平时大家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的更多相关文章
- 如何快速打好Java基础?
二哥,我是一名大学生,专业是电力工程,但想自学 Java,如何快速打好基础呢? 微信上 tison 向我提出了这个问题.我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 【JAVA面试题系列一】面试题总汇--JAVA基础部分
JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...
- 最适合作为Java基础面试题之Singleton模式
看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...
- java基础练习 字符串,控制流,日历,日期等
1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...
- Java基础知识【下】( 转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- java基础学习03(java基础程序设计)
java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...
随机推荐
- HTTP协议-请求报文
- delphi判断线程状态函数(使用GetExitCodeThread API函数去判断线程的句柄)
//判断线程是否释放//返回值:0-已释放:1-正在运行:2-已终止但未释放://3-未建立或不存在 function CheckThreadFreed(aThread: TThread): Byte ...
- Fabric-Crashlytics-Android 注意点
Fabric-Crashlytics-Android 注意点 非发布版本关闭Fabirc 官方文档中有这方面的介绍,有助于在开发过程中,提高编译速度和避免上报不必要的Crash 链接 一共两步 第一步 ...
- HTML5离线缓存攻击测试(二)
经过昨天的测试,发现使用离线缓存的网站会被攻击.但是,不使用离线缓存的网站就真的不会受到这样的攻击么? 据我理解,按照标准当浏览器请求manifest文件时,若没有请求到,或者文件发生改变,应当不使用 ...
- 微信小程序把玩(二十二)action-sheet组件
原文:微信小程序把玩(二十二)action-sheet组件 action-sheet组件是从底部弹出可选菜单项,估计也是借鉴IOS的设计添加的,action-sheet有两个子组件, action-s ...
- UWP开发学习笔记2
RelativePanel控件: 用法 描述 RelativePanel.Above 设置当前element为目标element的上方 RelativePanel.AlignBottomWith 设置 ...
- Android进程间通信-AIDL实现原理
Android进程间通信基于Proxy(代理)与Stub(桩或存根)的设计模式(如图1-1所示).其中,Proxy将特殊性接口转换成通用性接口,Stub将通用性接口转换成特殊性接口,二者之间的数据转换 ...
- Js 动态插入css js文件
function loadjscssfile(filename,filetype){ var file, //动态插入的文件 doc = document; if(filetype == " ...
- Android消息机制架构和源码解析
http://wangkuiwu.github.io/2014/08/26/MessageQueue/
- Spring Boot之Actuator的端点
Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况.有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何 ...