Java中return在Try-Catch中的执行
来源:互联网 发布:苹果软件发布 编辑:程序博客网 时间:2024/06/14 01:04
最近遇到try-catch中return的问题,需要结合Java运行时内存空间才能够理解。下面结合几个例子,探讨其内存空间的变化。
例 1
public class java_try_catch { public static void main(String[] args){ System.out.println(method()); } public static int method(){ int a = 1; try{ throw new Exception(); }catch(Exception e) { System.out.println("catch : a = " + a); return a; }finally{ a = 2; System.out.println("finally : a = " + a); } }}
运行结果:
catch : a = 1finally : a = 21
理解:
1、首先要理解 return 返回值 放在哪里。
方法 method() 中的a在 method 方法运行完之后就同该方法一起释放掉了,那return值怎么返回给主方法呢? 系统会分配一个临时空间(寄存器)用来存放method方法返回的值,然后再将这个临时值赋值给主方法的接收变量,再将临时空间(寄存器)释放 [参考http://bbs.csdn.net/topics/390891901 6楼的解释,再多的细节我也不清楚了= 。=]
2、理解上面代码的内存情况。
首先,变量 a 存放在栈中并赋值为1,try抛出异常,运行 catch 语句块。当运行到 return a 时,将 a 的值放入到寄存器,并执行 finally 语句块。而在 finally 中只是改变了栈中 a 的值,很显然寄存器中的值不会受到影响。因此,等 finally 语句块执行完后,主函数接收的是寄存器的值 1 。
例 2
import java.util.HashMap;import java.util.Map;public class java_try_catch { public static void main(String[] args){ System.out.println(method1()); } public static Map<String,Integer> method1() { Map<String,Integer> map = new HashMap<String,Integer>(); map.put("value", 1); try { throw new Exception(); } catch(Exception e) { System.out.println("catch : " + map); return map; } finally { map.put("value", 2); System.out.println("finally : " + map); } }}
运行结果:
catch : {value=1}finally : {value=2}{value=2}
理解:
1、首先理解 对象是什么,引用是什么。
程序跟上面差不多,为什么结果就不一样了?这里我们要知道,对象是存放在堆中的,其引用存放在栈中,且该引用的值为对象在堆中的地址。即,对象是 new 关键字创建的,引用是指向对象的 “指针”。画图说明:
2、理解上面代码的内存情况。
首先,在堆空间创建 HashMap 对象并放入值 {value,1}。执行 try-catch 语句块,将 map 的值放入寄存器,注意到,map 是对象的引用,其存储的其实为对象的地址,因此,return 放到寄存器的值,也是这个地址值,即对象的地址。 当执行 finally 块时,map.put 修改的是对象的值。所以最终,主函数读取该地址得到的是 {value,2} 。
小结
- 网上讲了各种情况: return 在 try 中、catch 中、finally 中,return 是一个变量、引用等,会得到什么样的值,但其实理解了其内存情况,就不用在乎那么多东西,反而简单很多。
- 以上也只是我的理解,不足之处望多多指教。
- Java中return在Try-Catch中的执行
- return在try-catch-finally中的执行
- Java中try-catch-finally中的return
- return语句在try-catch-finally中的执行顺序
- return语句在try-catch-finally中的执行顺序
- Java中的try-catch-finally-return的执行顺序
- java中try catch finally与return的执行顺序
- Java中try-catch-finally-return的执行顺序
- 关于Java中try-catch-finally-return的执行顺序
- 关于Java中try-catch-finally-return的执行顺序
- Java中try-catch-finally-return的执行顺序
- 关于Java中try-catch-finally-return的执行顺序
- 浅析Java try....catch....finally中return语句执行顺序
- Java中try-catch-finally-return的执行顺序
- java异常try catch finally中return具体执行顺序
- Java中try、catch、finally、return的执行顺序
- try...catch...finally中的return执行顺序
- return语句在Java的Try Catch Finally中的行为
- Tensorflow12-Dlib人脸检测
- Python3之协程
- js 子页面控制父页面操作刷新
- 如何溜溜地使用pandas操作数据(一)
- iOS-给数组去重的几个方法
- Java中return在Try-Catch中的执行
- HashMap的实现原理
- IDEA自动重置LanguageLevel和JavaCompiler的问题 (internal java compiler error)
- node与windows下的this
- Java笔记--02
- 拓展KMP
- Java 基本数据类型
- cocos2d-x: android编译和调试
- Flume NG 基本架构及原理