问题描述
笔试
这是京东校招的笔试题:
运行
打印运行结果,就是3
。
分析
我们将return
与finally
拆为几种情况综合分析。
finally之后return
private 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中return
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;
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
的改变会改变引用数据类型的返回值。
总结
格物致知,这是对基础的最佳实践。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。