JAVA小知识点-Finally和Return的执行关系
2015-06-08 12:46
435 查看
如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题:
执行结果:
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
结果分析:
从执行结果得出以下结论:
finally 即使在try或者catch中存在 return 且执行的情况下也会执行。
finally 对变量的修改发生在方法调用结束之前。
return 语句是在 finally 之前执行的。
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
结果分析:
引用类型发生了变化,基本数据类型没有修改。
从执行结果得出以下结论:
finally 即使在try或者catch中存在 return 且执行的情况下也会执行。
finally 对变量的修改发生在方法调用结束之前。
return 语句是在 finally 之前执行的。
return 的返回结果并不是返回原数据而是对原有数据的拷贝,基本数据类型拷贝基本类型值,引用类型拷贝引用而不拷贝引用内的值。
finally 内语句能够影响引用类型但不会影响基本数据类型。
相关文章推荐
- JAVA程序内存溢出问题原因分析
- java环境变量配置
- Struts2前台后台的数据传递 (转)
- 杭电ACM2022java做法
- nested exception is java.io.FileNotFoundException: class path resource [spring/spring-datasource-mog
- java连接mysql数据库增删改查操作记录
- JAVA判断32位还是64位,调用不同的DLL(转)
- Eclipse主题更换方法
- Java-JNA调用DLL(转)
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
- java高分局之JVM命令参数大全(高级运行时选项)
- java实现Kafka的消费者示例
- 二分查找法
- Missing class org.springframework.objenesis.ObjenesisStd
- java实现Kafka生产者示例
- java 转义字符
- Java项目管理之一:Svn
- spring :概述
- java异步线程
- eclipse 和 adt 适应mac的Retina字体设置