摘要:中,然后去执行,发现中也有,然后就执行的是中的,返回值为。我们看看中对变量的改变对返回值有没有影响。中中中这里虽然执行了,但是改变的是的值,并没有改变返回值。
问题描述 笔试
这是京东校招的笔试题:
运行打印运行结果,就是3。
分析我们将return与finally拆为几种情况综合分析。
finally之后returnprivate static int func() { int a = 1; try { System.out.println("try"); return a; } catch (Exception e) { System.out.println("catch"); } finally { System.out.println("finally"); } System.out.println("afterFinally"); return 10; }
看执行结果,我们分析return的原理。
try中执行到return时,先把这个值存起来,再开辟一块内存存这个值,然后去执行finally,finally执行之后,回去执行之前没执行完的return语句,将值返回。所以这种情况下,finally后的代码块是不执行的。
finally中returnprivate static int func() { int a; try { System.out.println("try"); a = 1; return a; } catch (Exception e) { System.out.println("catch"); a = 2; return a; } finally { System.out.println("finally"); a = 3; return a; } }
这就和笔试题中一样了。
try中return,然后去执行finally,发现finally中也有return,然后就执行的是finally中的return,返回值为3。
finally中改变变量的值 基本数据类型将上一个例子中finally中的return a;删了,就是我们接下来的测试。我们看看finally中对变量的改变对返回值有没有影响。
private static int func() { int a; try { System.out.println("try"); a = 1; return a; } catch (Exception e) { System.out.println("catch"); a = 2; return a; } finally { System.out.println("finally"); a = 3; } }
try中a = 1;
try中return a;
finally中a = 3;
这里虽然执行了a = 3,但是改变的是a的值,并没有改变返回值。
要是不信我们在finally再添加一行输出以验证我们的猜想。
引用数据类型相信这里我分为两个类别来叙述,熟悉Java的你应该明白我接下来要说什么了。
建个类MyObject,这里是为了演示方便才将value设置为public的,不要效仿啊。
public static void main(String[] args) { MyObject object = func(); System.out.println(object.value); } private static MyObject func() { MyObject myObject = new MyObject(); try { System.out.println("try"); myObject.value = 1; return myObject; } catch (Exception e) { System.out.println("catch"); myObject.value = 2; return myObject; } finally { System.out.println("finally"); myObject.value = 3; } }
与之前类似,不过这里是在finally中修改对象的属性。
运行,返回的结果是我们在finally中改变过的值。
finally中改变的,是myObject这个对象的value值,这个对象在堆内存中,而栈内存中用于返回的对象,其实也是堆内存中对象的引用,所以finally的改变会改变引用数据类型的返回值。
总结格物致知,这是对基础的最佳实践。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76855.html
摘要:基础系列的与方法类初始化顺序线程池如何弹性伸缩的几个要点的缓存什么场景下使用阻塞队列的使用及模式中的序本文主要简述中有的情况。参考关于中的执行顺序 Java基础系列 Java的hashcode与equals方法 Java类初始化顺序 ThreadPoolExecutor线程池如何弹性伸缩 HashMap的几个要点 Integer的缓存 什么场景下使用阻塞队列 volatile的使用及...
摘要:随着的出现,我最近发现自己在我的代码中使用了更多。但老实说,我终于用做了一点练习。当我去实际使用它时,我有点不确定它的细节。事实上,这就是本文的灵感来源。 随着async /await的出现,我最近发现自己在我的代码中使用了更多try /catch /finally。但老实说,我终于用finally做了一点练习。当我去实际使用它时,我有点不确定它的细节。所以我把几个例子放在一起。 当你...
摘要:随着的出现,我最近发现自己在我的代码中使用了更多。但老实说,我终于用做了一点练习。当我去实际使用它时,我有点不确定它的细节。事实上,这就是本文的灵感来源。 随着async /await的出现,我最近发现自己在我的代码中使用了更多try /catch /finally。但老实说,我终于用finally做了一点练习。当我去实际使用它时,我有点不确定它的细节。所以我把几个例子放在一起。 当你...
摘要:随着的出现,我最近发现自己在我的代码中使用了更多。但老实说,我终于用做了一点练习。当我去实际使用它时,我有点不确定它的细节。事实上,这就是本文的灵感来源。 随着async /await的出现,我最近发现自己在我的代码中使用了更多try /catch /finally。但老实说,我终于用finally做了一点练习。当我去实际使用它时,我有点不确定它的细节。所以我把几个例子放在一起。 当你...
阅读 3451·2021-11-19 09:40
阅读 1472·2021-10-13 09:41
阅读 2634·2021-09-29 09:35
阅读 2682·2021-09-23 11:21
阅读 1666·2021-09-09 11:56
阅读 812·2019-08-30 15:53
阅读 825·2019-08-30 15:52
阅读 584·2019-08-30 12:47