如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题:

public static Map<String, String> getMapTry() {
Map<String, String> map = new HashMap<String, String>();
map.put("KEY", "INIT"); try {
map.put("KEY", "TRY");
return map;
}
catch (Exception e) {
map.put("KEY", "CATCH");
e.printStackTrace();
}
finally {
map.put("KEY", "FINALLY");
} System.out.println("---------end--------");
return map;
} public static Map<String, String> getMapCatch() {
Map<String, String> map = null; try {
map.put("KEY", "TRY");
}
catch (Exception e) {
map = new HashMap<>();
map.put("KEY", "CATCH");
e.printStackTrace();
return map;
}
finally {
map.put("KEY", "FINALLY");
}
System.out.println("---------end--------");
return map;
} public static int getInt() {
Map<String, String> map = null;
int ret =0;
try {
map.put("KEY", "TRY");
ret = 1;
}
catch (Exception e) {
map = new HashMap<>();
map.put("KEY", "CATCH");
e.printStackTrace();
return ret;
}
finally {
map.put("KEY", "FINALLY");
ret =3;
}
System.out.println("---------end--------");
return ret;
} public static void main(String[] args) {
System.out.println("try:" + getMapTry().get("KEY").toString());
System.out.println("catch:" + getMapCatch().get("KEY").toString());
System.out.println("int:" + getInt()); }

执行结果:

try:FINALLY
java.lang.NullPointerException
  at com.wmshua.test.FinallyReturnRelation.getMapCatch(FinallyReturnRelation.java:43)
  at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:14)
catch:FINALLY
java.lang.NullPointerException
  at com.wmshua.test.FinallyReturnRelation.getInt(FinallyReturnRelation.java:63)
  at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:15)
int:0

结果分析:

引用类型发生了变化,基本数据类型没有修改。

从执行结果得出以下结论:

  1. finally 即使在try或者catch中存在 return 且执行的情况下也会执行。
  2. finally 对变量的修改发生在方法调用结束之前。
  3. return 语句是在 finally 之前执行的。
  4. return 的返回结果并不是返回原数据而是对原有数据的拷贝,基本数据类型拷贝基本类型值,引用类型拷贝引用而不拷贝引用内的值。
  5. finally 内语句能够影响引用类型但不会影响基本数据类型。

JAVA小知识点-Finally和Return的执行关系的更多相关文章

  1. java小知识点汇总

    1.ConcurrentHashMap使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安 ...

  2. java小知识点简单回顾

    1.java的数据类型分为两种:简单类型和引用类型(数组.类以及接口).注意,java没有指针的说法,只有引用.简单类型的变量被声明时,存储空间也同时被分配:而引用类型声明变量(对象)时,仅仅为其分配 ...

  3. java 小知识点

    1.转Java中Vector和ArrayList的区别   首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存 ...

  4. 转:Java中finally和return的执行关系

    finally可以分两方面理解 1.执行时机问题.finally总会执行(除非是System.exit()),正常情况下在try后执行,抛异常时在catche后面执行 2.返回值问题.可以认为try( ...

  5. java中异常处理finally和return的执行顺序

    根据个人亲自测试,得出如下结果: 1.try,catch中有没有return,finnally都会执行,而且是先执行try,catch后,最后执行finnally语句: 2.如果finnally中有r ...

  6. Java小知识点总结

    目录 配置 数据库配置文件 基础知识 Switch i++和++i 快捷打代码 输入数据 代码折叠 super关键字 instanceof 防止类型强制转换带来的错误 继承 第一个Java程序 Jav ...

  7. java小知识点 2015/10/6

    java中length,length(),size()区别: 1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度 2 java中的length()方法是针对字 ...

  8. Java小知识点总结01

    1. 整数相乘或者相加,如果超过最大整数值,会变成负数 2. 字符串比较可以使用:s1.compareTo(s2) ,如果s1大于s2返回值大于1,等于返回值等于0,小于返回值小于1 3. char值 ...

  9. java小知识点

    1 判断是否为win系统 int version=System.getProperty("os.name").toLowerCase().indexOf("windows ...

随机推荐

  1. jquery 仅仅读

    大家都理解这是什么,正常的写法例如以下: if (status == true) { $("#minDelistStr").val(totalAmount);// 去掉首部的&qu ...

  2. 如何使用Ubuntu online account API创建微博HTML5申请书

    在这篇文章中.我们将使用Ubuntu SDK提供online account API来訪问微博的API并显示所须要的内容.这篇文章的重点是展示怎样在HTML 5中使用online account AP ...

  3. Ubuntu更改hosts档

    Ubuntu更改hosts档 打开hosts档 sudo gedit /etc/hosts 下载hosts,并全选复制 hosts 粘贴到hosts文件里.保存就可以 $(function () { ...

  4. Tomcat 80 端口被占,解决方案

    Windows 平台下Tomcat启动不起,显示 SEVERE: Failed to initialize end point associated with ProtocolHandler [&qu ...

  5. 使用jquery实现放大镜效果

    原文:使用jquery实现放大镜效果 实现原理 首先,我们讲解一下放大镜效果的实现方式: 方法一:准备一张高像素的大图,当鼠标放到原图上,加载显示大图的对应位置. 方法二:对原图片进行放大,也就是调整 ...

  6. 【Unity 3D】学习笔记四十一:关节

    关节 关节组件能够加入至多个游戏对象中,而加入关节的游戏对象将通过关节连接在一起而且感觉连带的物理效果.须要注意的是:关节必须依赖于刚体组件. 关节介绍 关节一共分为5大类:链条关节,固定关节,弹簧关 ...

  7. AngularJs + ASP.NET MVC

    [AngularJs + ASP.NET MVC]使用AntularJs快速建立ASP.NET MVC SPA網站 這幾天接觸到了AngularJs的美麗,讓饅頭有點躍躍欲試使用AngularJs來做 ...

  8. 基于Bootstrap的Asp.net Mvc 分页

    基于Bootstrap的Asp.net Mvc 分页的实现 最近写了一个mvc 的 分页,样式是基于 bootstrap 的 ,提供查询条件,不过可以自己写样式根据个人的喜好,以此分享一下.首先新建一 ...

  9. 使用OpenWrt的SDK

    原文:http://wiki.openwrt.org/doc/howto/obtain.firmware.sdk 为什么要使用SDK: Reasons for using the SDK are: C ...

  10. Hudson+Maven+Svn搭建持续集成环境

    Hudson+Maven+Svn搭建持续集成环境 博客分类: 配置管理 mavenSVNTomcat项目管理配置管理 一.所用开发工具 1.    Hudson: Hudson 是一种革命性的开放源码 ...